Reactjs 反应类型脚本传递道具和数据类型
我对打字脚本还很陌生,我有几个问题要问。我的代码中有一些错误,我不确定如何传递道具并选择正确的类型。如果你能帮我一点忙,我将不胜感激 你有没有一个好的来源,我可以在一个地方找到所有必要的反应信息只是为了开始 tl;博士Reactjs 反应类型脚本传递道具和数据类型,reactjs,typescript,Reactjs,Typescript,我对打字脚本还很陌生,我有几个问题要问。我的代码中有一些错误,我不确定如何传递道具并选择正确的类型。如果你能帮我一点忙,我将不胜感激 你有没有一个好的来源,我可以在一个地方找到所有必要的反应信息只是为了开始 tl;博士 {data}类型是什么?如何定义它 如何将函数作为道具传递到Results.tsx文件?如何在此函数中定义结果、结果和openPopup 我错过什么了吗 App.tsx import React, { useState } from 'react' import axios f
import React, { useState } from 'react'
import axios from 'axios'
import Search from './components/Search'
import Results from './components/Results'
import Popup from './components/Popup'
export type selected = {
Title?: string,
Year?:number
}
type values = {
s: string,
results: string[],
selected: selected,
}
interface popup {
id: string
}
const App: React.FC = () => {
const [state, setState] = useState<values>({
s: "",
results: [],
selected: {}
});
const apiurl = "http://www.omdbapi.com/?apikey=dfe6d885";
const search = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter") {
axios(apiurl + "&s=" + state.s).then(({ data }) => {
let results = data.Search;
setState(prevState => {
return { ...prevState, results: results }
})
});
}
}
const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {
let s = e.target.value;
setState(prevState => {
return { ...prevState, s: s }
});
}
const openPopup = (id : string) => {
axios(apiurl + "&i=" + id).then(({ data }) => {
let result = data;
console.log(result);
setState(prevState => {
return { ...prevState, selected: result }
});
});
}
const closePopup = () => {
setState(prevState => {
return { ...prevState, selected: {} }
});
}
return (
<div className="App">
<header>
<h1>Movie Database</h1>
</header>
<main>
<Search handleInput={handleInput} search={search} />
<Results results={state.results} openPopup={openPopup} />
{(typeof state.selected.Title != "undefined") ? <Popup selected={state.selected} closePopup={closePopup} /> : false}
</main>
</div>
);
}
export default App
import React from 'react'
import Result from './Result'
function Results ({ results, openPopup }) {
return (
<section className="results">
{results.map(result => (
<Result key={result.imdbID} result={result} openPopup={openPopup} />
))}
</section>
)
}
export default Results
import React,{useState}来自“React”
从“axios”导入axios
从“./components/Search”导入搜索
从“./components/Results”导入结果
从“./components/Popup”导入弹出窗口
选择的导出类型={
标题?:字符串,
年份:数字
}
类型值={
s:弦,
结果:字符串[],
选中:选中,
}
界面弹出窗口{
id:字符串
}
常量应用程序:React.FC=()=>{
常量[状态,设置状态]=使用状态({
s:“,
结果:[],
所选:{}
});
常量apiurl=”http://www.omdbapi.com/?apikey=dfe6d885";
常量搜索=(e:React.KeyboardEvent)=>{
如果(e.key==“输入”){
axios(apiurl+“&s=“+state.s)。然后({data})=>{
让results=data.Search;
设置状态(prevState=>{
返回{…prevState,结果:results}
})
});
}
}
常量handleInput=(e:React.ChangeEvent)=>{
设s=e.target.value;
设置状态(prevState=>{
返回{…prevState,s:s}
});
}
const openPopup=(id:string)=>{
axios(apiurl+“&i=“+id”)。然后({data})=>{
让结果=数据;
控制台日志(结果);
设置状态(prevState=>{
返回{…prevState,选定:结果}
});
});
}
const closePopup=()=>{
设置状态(prevState=>{
返回{…prevState,选定:{}
});
}
返回(
电影数据库
{(typeof state.selected.Title!=“未定义”)?:false}
);
}
导出默认应用程序
结果。tsx
import React, { useState } from 'react'
import axios from 'axios'
import Search from './components/Search'
import Results from './components/Results'
import Popup from './components/Popup'
export type selected = {
Title?: string,
Year?:number
}
type values = {
s: string,
results: string[],
selected: selected,
}
interface popup {
id: string
}
const App: React.FC = () => {
const [state, setState] = useState<values>({
s: "",
results: [],
selected: {}
});
const apiurl = "http://www.omdbapi.com/?apikey=dfe6d885";
const search = (e: React.KeyboardEvent<HTMLInputElement>) => {
if (e.key === "Enter") {
axios(apiurl + "&s=" + state.s).then(({ data }) => {
let results = data.Search;
setState(prevState => {
return { ...prevState, results: results }
})
});
}
}
const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {
let s = e.target.value;
setState(prevState => {
return { ...prevState, s: s }
});
}
const openPopup = (id : string) => {
axios(apiurl + "&i=" + id).then(({ data }) => {
let result = data;
console.log(result);
setState(prevState => {
return { ...prevState, selected: result }
});
});
}
const closePopup = () => {
setState(prevState => {
return { ...prevState, selected: {} }
});
}
return (
<div className="App">
<header>
<h1>Movie Database</h1>
</header>
<main>
<Search handleInput={handleInput} search={search} />
<Results results={state.results} openPopup={openPopup} />
{(typeof state.selected.Title != "undefined") ? <Popup selected={state.selected} closePopup={closePopup} /> : false}
</main>
</div>
);
}
export default App
import React from 'react'
import Result from './Result'
function Results ({ results, openPopup }) {
return (
<section className="results">
{results.map(result => (
<Result key={result.imdbID} result={result} openPopup={openPopup} />
))}
</section>
)
}
export default Results
从“React”导入React
从“./Result”导入结果
函数结果({Results,openPopup}){
返回(
{results.map(结果=>(
))}
)
}
导出默认结果
道具类型
您可以定义传递给函数组件的道具
function Results ({ results, openPopup }: { results: MyResult[], openPopup: () => void }) {
但是更常见的是为道具定义一个单独的接口
interface Props {
results: MyResult[];
openPopup: () => void;
}
您可以使用它直接定义道具
function Results ({ results, openPopup }: Props) {
或通过React.FC
const Results: React.FC<Props> = ({ results, openPopup }) => {
现在,data
变量自动具有MyApiResponse
类型