Javascript 基于MapStateTops输出重新呈现connect()ed组件

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()获取“要检查的内容”并计算通

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

该组件基本上看起来像
,它与我们的API对话(通过Redux操作)来解决检查问题。如果授予了权限,则呈现
this.props.children
,否则为
null

为此,
mapStateToProps()
从存储中的授权数据中计算一个
传递的
道具,该道具在
s
render()
方法中签入。我使用
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
    进行额外的重新评估,而不是排除。