reactjs - Redux:为什么避免突变是使用它的基本部分?

标签 reactjs redux

我是 Redux 新手 - 我真的很想了解使用函数式编程使单向数据更加优雅的总体情况。

我的看法是 - 每个reducer都采用旧状态,创建一个新状态而不改变旧状态,然后将新状态传递给下一个reducer以执行相同的操作。

我知道不造成副作用可以帮助我们获得单向数据流的好处。

我真的不明白不改变旧状态有什么重要。

我唯一能想到的可能是我读过的“时间旅行”,因为如果你坚持每一种状态,你就可以执行和“撤消”。

问题:

还有其他原因导致我们不想在每一步都改变旧状态吗?

最佳答案

如果处理得当,使用不可变数据结构可以对性能产生积极影响。就 React 而言,性能通常是为了在数据未更改的情况下避免不必要的应用程序重新渲染。

为此,您需要将应用的下一个状态与当前状态进行比较。如果状态不同:重新渲染。否则就不要这样做。

要比较状态,您需要比较状态中的对象是否相等。在普通的旧 JavaScript 对象中,您需要进行深度比较才能查看对象内的任何属性是否发生了变化。

对于不可变对象(immutable对象),你不需要它。

immutableObject1 === immutableObject2

基本上就可以了。或者,如果您使用像 Immutable.js 这样的库 Immutable.is(obj1, obj2)

就 React 而言,您可以将其用于 shouldComponentUpdate 方法,就像流行的 PureRenderMixin 所做的那样。

shouldComponentUpdate(nextProps, nextState) {
    return nextState !== this.state;
}

当状态没有改变时,此函数可以防止重新渲染。

我希望这有助于不可变对象(immutable对象)背后的推理。

关于reactjs - Redux:为什么避免突变是使用它的基本部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531909/

相关文章:

reactjs - Redux 简单路由器 - 更改状态和 URL

javascript - 如何阻止 reducer 键本身成为键

javascript - React Native - navigation.navigate 不是一个函数

javascript - PushSubscription.endPoint 会随着时间的推移而变化吗?

javascript - React Native FlatList的scrollToEnd()不起作用

jquery - 当 img 不存在时使用 ReactJS 将其替换为空

reactjs - 错误: Expected an assignment or function call and instead saw an expression no-unused-expressions. How to solve it?

javascript - Push 不是一个函数,Redux

javascript - 将嵌套的 Redux 智能组件与 reducer 连接起来

reactjs - 带有 React 的 Redux-firestore