Axios 没有使用 useEffect() (React Js) [重复]

Posted

技术标签:

【中文标题】Axios 没有使用 useEffect() (React Js) [重复]【英文标题】:Axios is not getting anything with useEffect() (React Js) [duplicate] 【发布时间】:2021-10-23 16:48:22 【问题描述】:

我正在尝试使用 Axios 从 Django API 获取一些数据,并且当我只使用一次 useEffect(使用空数组 [] 调用它)时,它没有获取任何数据。但是,当我添加存储响应数据的状态时,它会进入无限循环并且每秒都在更改数据。我知道使用空数组调用 useEffect 只会调用一次,但它似乎不起作用。我怎样才能设法只获取一次数据?

我的代码:

function IdentificationStep(props) 

  const [predictions, setPrediction] = useState([]);
  const [loadingState, setLoadingState] = useState(true);
  const [getValue , SetValue] = useState(true)
  useEffect(() => 
    setTimeout(() => 
      setLoadingState(false);
    , 3000);
  , []);


  const getPredictions = async () => 
    const response = await axios.get('/snake-image/prediction/'+(props.id))
    setPrediction(response.data)
  

   useEffect(() =>  getPredictions(); console.log(predictions); SetValue(false), [])
   //infinite loop when i track predictions state
   //useEffect(() =>  getPredictions(); console.log(predictions); SetValue(false), [predictions])

我试过 .then(),就像 boxdox 向我建议的那样,但它仍然返回一个空数组

const getPredictions = async () => 
    const response = await axios.get('/snake-image/prediction/'+(props.id)).then(response => 
      setPrediction(response.data);
      console.log(predictions);
    )
    //setPrediction(response.data)
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

我得到一个像这样的空数组:

感谢帮助,我解决了

问题是使用效果一直在无限循环。我刚刚检查了我的预测状态的长度,然后在 useeffect() 上使用 if else 块

useEffect(() => 
    async function getPredictions() 
      let response = await axios.get('/snake-image/prediction/'+(props.id));
      response = await response;
      setPrediction(response.data);
      setLoadingState(false);
      console.log(response.data);
    


    if(predictions.length < 3)
    
      getPredictions();
    console.log(predictions);
    

    elseconsole.log("already done")
    
  , [predictions])

【问题讨论】:

getPredictions 返回一个承诺。你要么等待它,要么使用.then 使用它但得到相同的结果可能我做错了什么?? ***.com/a/53572588/10796932 以后,当您解决自己的问题时,请将您的解决方案作为答案发布,而不是编辑您现有的问题。 好的,谢谢你的提示 【参考方案1】:

由于您的 getPredictions 是一个异步函数,这就是您没有在 useEffect 中获取数据的原因。您可以通过在 useEffect 中声明函数来做到这一点:

function IdentificationStep(props) 
  const [predictions, setPrediction] = useState([]);
  const [loadingState, setLoadingState] = useState(true);
  const [getValue, SetValue] = useState(true);
  useEffect(() => 
    setTimeout(() => 
      setLoadingState(false);
    , 3000);
  , []);

  useEffect(() => 
    const getPredictions = async () => 
      const response = await axios.get("/snake-image/prediction/" + props.id);
      setPrediction(response.data);
    ;
    await getPredictions();
    console.log(predictions);
    SetValue(false);
  , []);


【讨论】:

console.log(predictions); 仍会记录 wrong 值。请参阅链接的副本了解原因。 我试过它抛出一个错误,(意外的保留字'await')。在第 40 行,即使函数是异步的……不知道为什么? await 在常规函数中不起作用。您需要将传递给 useEffect 的匿名函数定义为异步,但这在 use effect 中不起作用。 @boxdox。这也是一种方法,但我们也可以这样做。您可以做的是在开始获取时将加载状态设置为true,当获取数据时,您可以将加载状态设置为false,并根据加载状态呈现您的预测。

以上是关于Axios 没有使用 useEffect() (React Js) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在useEffect中使用axios请求测试反应组件?

使用 axios 和 useEffect 无法显示信息

使用 useEffect 反应 axios 获取请求而不会导致无限循环

为啥我的 axios 使用 React.useEffect 一遍又一遍地从 Rails 后端获取调用?

使用 axios 获取数据后 React useEffect 返回空数组

无法在 useEffect() 中从 AXIOS 获取数据