美文网首页
ReactNative中setState同步更新策略

ReactNative中setState同步更新策略

作者: 农田蚂蚁 | 来源:发表于2018-01-19 09:55 被阅读0次

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);
              });
          }
    );
}

相关文章

网友评论

      本文标题:ReactNative中setState同步更新策略

      本文链接:https://www.haomeiwen.com/subject/wytooxtx.html