Javascript 为什么我的状态不是';你没有被充满回应吗?
log(data)为我提供了一个具有正确数据的对象,但我为该数据设置了速率,但当console日志记录速率时,我得到了一个空对象{}。提前谢谢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
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说的。