React 中对象的状态更新是如何准确工作的

How does the state updates of objects in React work accurately

我正在学习 React,并试图围绕语法和概念进行思考。从 React 的教程中提到:

State Updates May Be Asynchronous

React may batch multiple setState() calls into a single update for performance.

Because this.props and this.state may be updated asynchronously, you should not rely on their values for calculating the next state.

我的问题是,如果this.state不是一直更新,我们能靠它显示正确的信息吗?如果我的理解是正确的,React出于性能考虑会批量更新这个state,但是会影响应用的准确性吗? React 如何创建这些批次以及它们何时应用?

React 将在合理的情况下尽快渲染具有更新状态的组件 - 例如,在事件处理程序中,您可以更改多个组件的状态,但是单独使用新状态渲染它们是不合理的 - 相反,React 会事件处理程序完成后批量更新和呈现组件。

在正确编写的应用程序中,更新和渲染之间的延迟对用户来说是不明显的。从开发人员的角度来看,异步更新可能会引入 hard-to-find 错误(使用 Redux,其中每个状态更新都基于先前的状态应该可以解决大部分错误;这当然也可以在纯 React 中使用 setState() 和回调) .

React 使用状态来帮助管理 javascript 的每个组件。因为状态总是可以改变的,所以它非常灵活。一个缺点是,由于它很灵活,所以当有多个对象时很难管理状态。将组件保持在可管理的部分是理想的,这样您就可以在状态未按预期运行时进行定位。

为了防止数据意外变异,tools/concept ImmutableJs 或 Redux 等已与 React 相结合,使管理工具更加高效。

Redux controls/organizes 状态片段通过 one-directional 流改变。 http://redux.js.org/docs/basics/UsageWithReact.html

ImmutableJs 使用持久不变的数据结构来锁定状态以防止意外更改。 https://facebook.github.io/immutable-js/

状态是异步的并不意味着你不能依赖它,但你应该小心使用你保留在那里的信息的方式和时间。

例如:

this.setState({charCount: 5});
console.log(this.state.charCount) // may not be 5 as setState is asynchronous

另一方面,您可以使用回调来确保您获得了正确的值:

this.setState({charCount: 5}, () => { console.log(this.state.charCount) });

一般做法是,您应该尽量减少状态的使用,并且仅在用户界面需要更改时才使用它。如果您需要在没有 UI 更改的情况下处理或操作数据,请尝试避免使用状态并使用例如这种做法:Lifting State Up