gpt4 book ai didi

immutability - 状态不变性在 Redux 中实际是如何使用的?

转载 作者:行者123 更新时间:2023-12-01 12:29:14 25 4
gpt4 key购买 nike

我试图了解不变性实际上(如果有的话)是如何在 Redux 中使用的。我发现的每篇教程/文章/文档都指出,reducer 永远不应更改状态对象,而是创建已更改数据的新副本(即 reducer 必须是纯函数)。我理解这一点,但我找不到任何地方解释 Redux 内部实现如何实际使用该指南。

这只是一个强烈的推荐,还是如果我将 reducer 设置为非纯的,Redux 内部的某些东西会崩溃吗?

如果是后者那么究竟会破坏什么?

我确实找到了几个地方,Dan 说在某些(非常罕见的)情况下,reducer 可能是非纯的,但它是有风险的(同样,没有解释确切的风险是什么)。

最佳答案

Redux 与 React 一起使用时,通常使用 react-redux 中的 connect 进行连接。使用 connect 包装组件,通过指定更改处理程序使其订阅 redux 存储的更改,该更改处理程序在分派(dispatch)操作和调用 reducers 后调用。在调用更改处理程序时,connect 使用标识比较 (previousState !== newState) 将存储的当前状态与新状态进行比较——这比执行浅比较或深度比较——只有当两个状态不相同时,它才会使用 setState 更新包装的组件。直接改变状态不会导致引用改变,从而导致包装组件不重新渲染。

这就是 connect 确定它是否应该调用 setState 的方式:

if (!pure || prevStoreState !== storeState) {
this.hasStoreStateChanged = true
this.setState({ storeState })
}

connect 还提供了一个选项来通过指定包装的组件不是纯使用来覆盖此行为:

连接(mapStateToProps,mapDispatchToProps,mergeProps,{pure:false})

纯组件也通过实现 shouldComponentUpdate 来使用标识比较,以防止不必要地调用 render

TL;DR:如果商店的状态因突变而发生变化,则用 connect 包装的组件将不会重新呈现。

编辑:Redux 本身的任何内容都不会中断,因为它是如此之小以至于它不会尝试检查 reducer 返回的状态。

关于immutability - 状态不变性在 Redux 中实际是如何使用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com