简体   繁体   English

如何获取结果并将结果传递给反应中的下一个获取?

[英]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如何获取versionlanguages并将它们传递给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 = 0languages = []

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.似乎getVersiongetLanguages并不相互依赖,可以同时运行,而不是一个接一个地运行。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM