You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Expo环境React Native中,如何等待useState赋值后再调用函数?

解决React Native中useState更新后无法立即获取值的问题

这个问题其实是React useState的异步特性导致的——调用setGridData之后,组件并不会立刻重新渲染,当前作用域里的gridData还是初始的空数组,所以你紧接着调用pressed时,打印的自然是旧值。下面给你两种实用的解决办法:

方法一:直接传递API返回值(最直接)

既然你已经拿到了response,完全可以跳过状态,直接把它作为参数传给pressed函数,这样就不用等状态更新了:

const [gridData, setGridData] = useState([]);
useEffect(() => { 
  getGridApi().then((response)=>{
    setGridData(response); 
    pressed('Mon', 0, response); // 直接传入最新数据
  }) 
}, []);

const pressed = async (category, index, data) => { 
  console.log(data); // 这里就能拿到最新的grid数据了
}

这种方法适合你只需要在初始化时调用一次pressed的场景,简单高效。

方法二:用useEffect监听状态变化

如果之后gridData可能会多次更新,每次更新都需要触发pressed,那可以用另一个useEffect来监听gridData的变化,等它更新完成后再调用函数:

const [gridData, setGridData] = useState([]);
useEffect(() => { 
  getGridApi().then((response)=>{
    setGridData(response); 
  }) 
}, []);

// 监听gridData的变化,当它有值时执行pressed
useEffect(() => {
  // 加个判断避免初始空数组时触发
  if (gridData.length > 0) {
    pressed('Mon', 0);
  }
}, [gridData]); // 依赖项设为gridData,状态更新时触发

const pressed = async (category, index) => { 
  console.log(gridData); // 现在能拿到更新后的数组了
}

这种方式利用了React的生命周期,当gridData完成更新并触发组件重新渲染后,第二个useEffect会执行,此时的gridData就是最新值。

总结一下:React的状态更新是异步批量处理的,不要在调用setState(或setGridData)后立刻依赖状态值做操作,要么直接用更新前的数据源,要么通过监听状态变化来触发后续逻辑。

内容的提问来源于stack exchange,提问作者Leoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:42:39