ReactNative中setState同步更新策略

ReactNative的视图刷新机制和React一脉相承,ReactNative通过this.state来访问state,通过this.setState()方法来更新state。当this.setState()方法被调用的时候,ReactNative会重新调用render方法来重新渲染UI。

同步更新可能会失败

这段时间在做项目的时候发现了通过this.setState()更新state延迟的问题,就是当state的值还没更新完毕的时候,这时render方法已经渲染完毕,通过this.state计算的UI状态就会出现错误,特别是当你的视图层级结构非常深的时候这种情况更明显。举个例子,我们希望在从服务端抓取数据并且渲染到界面之后,再隐藏加载进度条或者外部加载提示。

componentDidMount() {
    fetch('https://test.com')
        .then((res) => res.json())
        .then(
            (data) => {
                this.setState({ data:data });
                StatusBar.setNetworkActivityIndicatorVisible(false);
            }
        );
}

因为 setState 函数并不会阻塞等待状态更新完毕,因此 setNetworkActivityIndicatorVisible 有可能先于数据渲染完毕就执行。

解决方案

我们来看一下React文档中对setState的说明

void setState(
    function|object nextState,
    [function callback]
)

The second (optional) parameter is a callback function that will be executed once setState is completed and the component is re-rendered.
翻译一下,第二个参数是一个回调函数,在setState的异步操作结束并且组件已经重新渲染的时候执行。也就是说,我们可以通过这个回调来拿到更新的state的值。
所以上面的代码我们可以这样写,可以实现同步更新。

componentDidMount() {
    fetch('https://test.com')
        .then((res) => res.json())
        .then(
            (data) => {
                this.setState({ data:data },()=>{
                   StatusBar.setNetworkActivityIndicatorVisible(false);
              });
          }
    );
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 7,870评论 1 18
  • 说在前面 关于 react 的总结过去半年就一直碎碎念着要搞起来,各(wo)种(tai)原(lan)因(le)。心...
    陈嘻嘻啊阅读 11,824评论 7 41
  • 最近看了一本关于学习方法论的书,强调了记笔记和坚持的重要性。这几天也刚好在学习React,所以我打算每天坚持一篇R...
    gaoer1938阅读 5,694评论 0 5
  • 使用 create-react-app 快速构建 React 开发环境 项目的目录结构如下: React JSX ...
    majun00阅读 3,480评论 0 0
  • 这几天做高德地图,发现INVALID_USER_SCODE这个问题,可以定位,导航,设置大头针,一切功能都可以实现...
    未知的远方阅读 7,916评论 0 0

友情链接更多精彩内容