我可能遗漏了一些非常明显的东西,并想澄清自己。
这是我的理解。
在一个幼稚的反应组件中,我们有 states
& props
。用 setState
更新 state
--- 会重新渲染整个组件。 props
大多是只读的,更新它们没有意义。
在订阅 redux 存储的反应组件中,通过类似 store.subscribe(render)
,它显然会在每次更新存储时重新呈现。
react-redux 有一个助手 connect()
注入状态树的一部分(组件感兴趣)和 actionCreators 作为 props
到组件,通常通过类似
const TodoListComponent = connect(
mapStateToProps,
mapDispatchToProps
)(TodoList)
但是了解 setState
对于 TodoListComponent
对 redux 状态树更改(重新渲染)做出反应是必不可少的,我找不到任何 state
或者 setState
相关代码在 TodoList
组件文件中。它的内容如下:
const TodoList = ({ todos, onTodoClick }) => (
<ul>
{todos.map(todo =>
<Todo
key={todo.id}
{...todo}
onClick={() => onTodoClick(todo.id)}
/>
)}
</ul>
)
有人可以指出我所缺少的正确方向吗?
PS 我正在关注与 redux 包 捆绑的待办事项列表示例。
原文由 Joe Lewis 发布,翻译遵循 CC BY-SA 4.0 许可协议
connect
函数生成一个订阅存储的包装组件。当一个动作被调度时,包装组件的回调会被通知。然后它运行你的mapState
函数,并 浅比较 这次的结果对象和上次的结果对象(所以如果你用相同的值 重写 一个 redux 存储字段,它不会触发重新渲染)。如果结果不同,那么它将结果作为道具传递给您的“真实”组件。Dan Abramov 在 ( connect.js ) 上写了一个很棒的简化版本
connect
说明了基本思想,尽管它没有显示任何优化工作。我也有一些关于 Redux 性能 的文章的链接,这些文章讨论了一些相关的想法。更新
React-Redux v6.0.0 对连接组件如何从存储中接收数据进行了一些重大的内部更改。
作为其中的一部分,我写了一篇文章,解释了
connect
API 及其内部的工作原理,以及它们如何随时间变化:惯用的 Redux:React-Redux 的历史和实现