React 中 setState() 为什么是异步的?
前言不知道大家有没有过这个疑问,React 中 注意:这篇文章根据 Dan 的回复写成,但不是一篇翻译。我忽略了很多不太重要的内容,Dan 的完整回复请看这里。 正文Dan 在回复中表示为什么 一、保证内部的一致性首先,我想我们都同意推迟并批量处理重渲染是有益而且对性能优化很重要的,无论 现在的设计保证了 React 提供的 objects(state,props,refs)的行为和表现都是一致的。为什么这很重要?Dan 举了个栗子: 假设 console.log(this.state.value) // 0 this.setState({ value: this.state.value + 1 }); console.log(this.state.value) // 1 this.setState({ value: this.state.value + 1 }); console.log(this.state.value) // 2 然而,这时你需要将状态提升到父组件,以供多个兄弟组件共享: -this.setState({ value: this.state.value + 1 }); +this.props.onIncrement(); // 在父组件中做同样的事 需要指出的是,在 React 应用中这是一个很常见的重构,几乎每天都会发生。 然而下面的代码却不能按预期工作: console.log(this.props.value) // 0 this.props.onIncrement(); console.log(this.props.value) // 0 this.props.onIncrement(); console.log(this.props.value) // 0 这是因为同步模型中,虽然 所以为了解决这样的问题,在 React 中 最后 Dan 总结说,React 模型更愿意保证内部的一致性和状态提升的安全性,而不总是追求代码的简洁性。 二、性能优化我们通常认为状态更新会按照既定顺序被应用,无论 React 会依据不同的调用源,给不同的 Dan 又举了个栗子。假设你在一个聊天窗口,你正在输入消息, 如果给某些更新分配低优先级,那么就可以把它们的渲染分拆为几个毫秒的块,用户也不会注意到。 三、更多的可能性Dan 最后说到,异步更新并不只关于性能优化,而是 React 组件模型能做什么的一个根本性转变(fundamental shift)。 Dan 还是举了个栗子。假设你从一个页面导航到到另一个页面,通常你需要展示一个加载动画,等待新页面的渲染。但是如果导航非常快,闪烁一下加载动画又会降低用户体验。 如果这样会不会好点,你只需要简单的调用 事实证明,在现在的 React 模型基础上做一些生命周期调整,真的可以实现这种设想。@acdlite 已经为这个功能努力几周了,并且很快会发布一个 RFC(亦可赛艇!)。 需要注意的是,异步更新 Dan 最后对 Michel 说到:我希望我们能在接下来几个月说服你,并且你会欣赏到 React 模型的灵活性。据我理解,这种灵活性至少一部分要归功于 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |