[英]How can I fetch and pass the result to the next fetch in react?
How can I fetch the version
and languages
and pass them to getChampions
function如何获取
version
和languages
并将它们传递给getChampions
function
const [version, setVersion] = useState(0)
const [languages, setLanguages] = useState([])
const [selectedLanguage, setSelectedLanguage] = useState('')
const [champions, setChampions] = useState([])
useEffect(() => {
getVersion().then((version) => setVersion(version))
.then(getLanguages().then(languages => {
setLanguages(languages)
setSelectedLanguage(languages[0])
}))
.then(getChampions(version, selectedLanguage).then(champions => setChampions(champions)))
}, [])
I'm getting the default values from the initialization of useState
where version = 0
and languages = []
我从
useState
的初始化中获取默认值,其中version = 0
和languages = []
You can use async await in a separate function to fetch the version and language and use the fetched version and language to fetch the champions data.您可以在单独的 function 中使用 async await 来获取版本和语言,并使用获取的版本和语言来获取冠军数据。 Take a look at below example.
看看下面的例子。
const [version, setVersion] = useState(0) const [languages, setLanguages] = useState([]) const [selectedLanguage, setSelectedLanguage] = useState('') const [champions, setChampions] = useState([]) const fetchData = async () => { const versionData = await getVersion(); setVersion(versionData) const languageData = await getLanguages(); setLanguages(languageData) setSelectedLanguage(languageData[0]) const championsData = await getChampions(versionData, languageData[0]) setChampions(championsData) } useEffect(() => { fetchData(); }, [])
setState
is asynchronous, so if you setState
and then call a function with the state
immediately after you are not guaranteed to get the current state
value. setState
是异步的,所以如果你setState
然后在你不能保证获得当前的state
值之后立即使用state
调用 function。 @Yadab's answer resolves this but calling getChampions
with the variables from the response rather than the variables from the state. @Yadab 的回答解决了这个问题,但使用响应中的变量而不是 state 中的变量调用
getChampions
。
My personal preference is to use a separate hook to respond to changes in the state.我个人的偏好是使用单独的钩子来响应 state 的变化。 It also seems like
getVersion
and getLanguages
don't depend on each other and can be run simultaneously rather than one after the other.似乎
getVersion
和getLanguages
并不相互依赖,可以同时运行,而不是一个接一个地运行。
const App = () => {
const [version, setVersion] = useState(0);
const [languages, setLanguages] = useState([]);
const [selectedLanguage, setSelectedLanguage] = useState("");
const [champions, setChampions] = useState([]);
useEffect(() => {
getVersion().then(setVersion);
}, []); // run once - include [setVersion] if using eslint
useEffect(() => {
getLanguages().then((languages) => {
setLanguages(languages);
setSelectedLanguage(languages[0]);
});
}, []); // run once - can include deps [setLanguage, setSelectedLanguage] for eslint
useEffect(() => {
// only execute if both version and selectedLanguage have already been set
if (version && selectedLanguage) {
getChampions(version, selectedLanguage).then(setChampions);
}
}, [version, selectedLanguage]); // run whenever version or selected language changes
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.