Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的状态不是';你没有被充满回应吗?_Javascript_Reactjs_Axios - Fatal编程技术网

Javascript 为什么我的状态不是';你没有被充满回应吗?

Javascript 为什么我的状态不是';你没有被充满回应吗?,javascript,reactjs,axios,Javascript,Reactjs,Axios,log(data)为我提供了一个具有正确数据的对象,但我为该数据设置了速率,但当console日志记录速率时,我得到了一个空对象{}。提前谢谢 const [rates, setRates] = useState({}); useEffect(() => { search(); }, []); const search = async () => { const response = await axios.get('https://api.excha

log(data)为我提供了一个具有正确数据的对象,但我为该数据设置了速率,但当console日志记录速率时,我得到了一个空对象{}。提前谢谢

const [rates, setRates] = useState({});

  useEffect(() => {
    search();
  }, []);

  const search = async () => {
    const response = await axios.get('https://api.exchangeratesapi.io/latest');
    const data = response.data.rates;
    console.log(data);
    setRates(data);
    console.log(rates);
  };

正如有人在评论中所说,状态更新将反映在下一次渲染中。另外,我将解决您的代码中存在的一些问题

  const [rates, setRates] = useState({});

  useEffect(() => {
      // move this in here unless you plan to call it elsewhere
      const search = async () => {
          const response = await axios.get('https://api.exchangeratesapi.io/latest');
          const data = response.data.rates;
          setRates(data);
       };
    search();

  }, [/* no dependencies means it runs once */]);
如果您确实计划在其他地方调用
search
,请将其包装在
useCallback
钩子中,这样您就可以将其设置为
useffect
的依赖项(您将得到一个lint警告,而不显示)
useCallback
和空的依赖项数组将始终返回相同的函数引用,因此您的
useEffect
将只像现在一样运行一次

如果将
search
保留为组件中的正常函数,则引用会更改每个渲染,因此如果将每个渲染作为依赖项包含,效果将运行

 const [rates, setRates] = useState({});  
 const searchCallback = useCallback(async () => {
      const response = await axios.get('https://api.exchangeratesapi.io/latest');
      const data = response.data.rates;
      setRates(data);
  }, [])

 useEffect(() => {
      // move this in here unless you plan to call it elsewhere
      
    search();

 }, [searchCallback]);

不要在
search
中使用
rates
这是否回答了您的问题?TL;DR react状态是常量,本质上是异步的,并且在渲染周期之间进行更新。是的,Drew说的。