基于mapStateToProps输出重新渲染connect()ed组件

Nic*_*der 10 javascript reactjs redux

在基于React + Redux的项目中,我有一个connect()ed组件,它通过API提取来检查用户权限.提取的权限存储在Redux存储中.

该组件基本上看起来像<Can check="...">...</Can>,与我们的API(通过Redux操作)对话以解决检查.如果授予了权限,this.props.children则呈现,null否则.

为此,从商店中的授权数据mapStateToProps()计算passesprop,用<Can />s render()方法检查.我利用ownProps参数来mapStateToProps()获取"要检查的东西"并计算passes标志.

有一些缓存正在进行,所以我不会重新获取每个组件挂载,它基本上有效.但是,有时候,当passesprop更新时,组件将不会重新渲染true(但是在导航之后渲染 - 使用反应路由器 - 然后再返回,所以基本上如果组件被重新安装).

connect()编辑组件重新渲染,如果从输出mapStateToProps()的变化?该文档为react-reduxconnect()这样说:

如果将ownProps指定为第二个参数,则其值将是传递给组件的props,并且只要组件接收到新的props,就会重新调用mapStateToProps.

这是否意味着传入ownProps会将渲染更改为仅在道具更改时重新渲染,或者以其他方式重新渲染?如何理解有关记忆/返回功能的说明mapStateToProps(),或者甚至不相关?

谢谢

Dan*_*mov 11

如果mapStateToProps()的输出发生变化,connect()ed组件是否会重新渲染?react-redux的connect()的文档说:

函数的输出本身不能改变.必须先触发此功能才能重新评估.

如果Redux状态发生变化,mapStateToProps则重新进行评估.

如果从父组件接收的props非常不相等(已更改)并且您使用ownProps参数,mapStateToProps则也会重新评估.

如果mapStateToProps返回的值与上次调用的值相等,则React Redux将跳过渲染.如果它返回浅不相等的值,则将重新呈现包装的组件.假设它mapStateToProps本身是一个纯函数.

但是,有时候,当传递道具更新为true时,组件不会重新渲染

请创建一个复制此项的最小项目,并提交相关代码示例的问题.

如何理解关于memoization /从mapStateToProps()返回函数的注释,或者甚至不相关?

不相关的.


mar*_*son 7

这里要了解几件事:

  1. connect将浅层比较上次mapState调用当前mapState调用的输出.如果没有任何改变,它将不会重新渲染包装的组件.
  2. 默认情况下,connectmapState在商店通知订阅者时运行.但是,如果你的mapState函数被声明为带两个参数,connect则将包装组件的props作为第二个arg传入,允许你做类似的事情state.somePerItemData[ownProps.itemId].它随后会mapState在传入的道具不同时调用,因为这可能会影响输出mapState.
  3. Reselect的默认memoization仅为每个选择器函数保留一个缓存值.如果你有一个多次实例化的组件,并且所有实例共享相同的选择器函数实例,那么选择器的memoization可能不会按你想要的方式工作,因为每个组件实例可能用不同的输入调用它(例如他们自己的道具).因此,作为一种非常高级的优化,您实际上可以将工厂函数作为mapState参数传递,这可以为每个组件实例创建唯一的选择器函数实例.

所有这一切,我担心我对你未更新的组件的实际问题没有具体的答案.我可能需要更详细地查看代码.