Javascript 基于MapStateTops输出重新呈现connect()ed组件
在基于React+Redux的项目中,我有一个Javascript 基于MapStateTops输出重新呈现connect()ed组件,javascript,reactjs,redux,Javascript,Reactjs,Redux,在基于React+Redux的项目中,我有一个connect()ed组件,它通过API获取检查用户权限。获取的权限存储在Redux存储中 该组件基本上看起来像…,它与我们的API对话(通过Redux操作)来解决检查问题。如果授予了权限,则呈现this.props.children,否则为null 为此,mapStateToProps()从存储中的授权数据中计算一个传递的道具,该道具在srender()方法中签入。我使用ownProps参数来mapstatetops()获取“要检查的内容”并计算通
connect()
ed组件,它通过API获取检查用户权限。获取的权限存储在Redux存储中
该组件基本上看起来像…
,它与我们的API对话(通过Redux操作)来解决检查问题。如果授予了权限,则呈现this.props.children
,否则为null
为此,mapStateToProps()
从存储中的授权数据中计算一个传递的道具,该道具在
srender()
方法中签入。我使用ownProps
参数来mapstatetops()
获取“要检查的内容”并计算通过标志
有一些缓存正在进行,所以我不会在每个组件挂载上重新获取,它基本上可以工作。但是,有时当将道具更新传递到true
时,该组件不会重新渲染(但是,它会在导航离开(使用react router)并再次返回后进行渲染,因此基本上是在组件重新安装时进行渲染)
如果MapStateTrops()
的输出发生更改,是否重新渲染connect()
ed组件?react-redux
的connect()
的文档说:
如果将ownProps指定为第二个参数,则其值将是传递给组件的props,并且每当组件接收到新的props时,将重新调用mapStateToProps
这是否意味着传入ownProps
会将渲染更改为仅在props更改时重新渲染,或者以任何其他方式重新渲染?我如何理解关于从mapstatetops()
记忆/返回函数的注释,或者这与此无关
多谢各位
如果MapStateTops()的输出发生更改,connect()是否会重新渲染组件?react-redux的connect()的文档如下所示:
函数的输出不能自行更改。首先,必须有某种东西触发此函数进行重新评估
如果Redux状态发生更改,则会重新计算MapStateTrops
如果从父组件接收到的props不相等(已更改),并且您使用了ownProps
参数,MapStateTrops
也会重新计算
如果mapStateToProps
返回的值与上次调用的值相差不大,则React-Redux将跳过渲染。如果返回的值不相等,则将重新渲染包裹的组件。假定MapStateTops
本身是一个纯函数
但有时,当PASS道具更新为true时,组件不会重新渲染
请创建一个最小的项目来复制这个,并用相关的代码示例提交一个问题
我如何理解关于从mapStateToProps()记忆/返回函数的注释,或者这与此无关
不相关。这里有几件事需要知道:
connect
将上一次mapState
调用的输出与当前的mapState
调用进行比较。如果没有任何更改,它将不会重新渲染已包装的组件
默认情况下,connect
仅在商店通知订户时运行mapState
。但是,如果您的mapState
函数声明为使用两个参数,connect
将传入包装组件的props作为第二个参数,允许您执行类似于state.somePerItemData[ownProps.itemId]
的操作。当传入的道具不同时,它还会调用mapState
,因为这可能会影响mapState
的输出
重选的默认记忆功能仅为每个选择器函数保留一个缓存值。如果您有一个多次实例化的组件,并且所有实例都共享同一个选择器函数实例,那么选择器的记忆可能无法按您希望的方式工作,因为每个组件实例可能使用不同的输入(例如它们自己的道具)调用它。因此,作为一种高级优化,您实际上可以将工厂函数作为mapState
参数传递,这可以为每个组件实例创建一个唯一的选择器函数实例
综上所述,对于您关于未更新组件的实际问题,我恐怕没有具体的答案。我可能需要更详细地查看代码。谢谢您这么快的回答。在提交问题之前,我将再次检查并确保减速器或选择器逻辑中没有任何错误。浅层平等性检查可能是一个问题。作为对文档的快速建议,可能会将措辞更改为[…],并且每当组件收到新道具时,MapStateTops将被重新调用*另外*。感谢您的澄清。我们不使用重新选择,但我可以看到您描述的问题。我忽略了在mapState
中使用ownProps
会导致对mapState
进行额外的重新评估,而不是排除。