基于我刚刚阅读并重新阅读的所有 Redux 和 Reselect 文档,thing.toJS()
如果getThing()
返回的不可变映射不等于前一个,则下面的选择器应该只进行处理。
...
// Selector
import { createSelector } from 'reselect'
const getThing = (state, thingId) => {
return state.entities.getIn(['things', thingId])
}
const makeThingSelector = () => {
return createSelector(
[getThing],
(thing) => {
return thing.toJS()
}
)
}
export default makeThingSelector
...
// Container
const makeMapStateToProps = () => {
return (state, ownProps) => {
const { thingId } = ownProps
const things = select.makeThingsSelector()(state, thingId)
return {
hasNoThings: things.length === 0,
things
}
}
}
const Container = connect(
makeMapStateToProps,
mapDispatchToProps
)(Component)
...
除非我有一个孩子的“智能”组件,否则这是正确的。在这种情况下,当父组件触发渲染时,子组件容器中调用的选择器总是处理该值,而不管结果是否是新的。
我一直在尝试将 ImmutableJS API 封装在我的选择器中,但这意味着要避免每次它们的父组件更新时重新渲染这些嵌套组件,我必须在shouldComponentUpdate
函数中进行深度相等检查。这很昂贵,而且似乎不是一个体面的解决方案。
应用程序状态被规范化,因此状态树的更新部分不是子组件所依赖的状态部分的分层父级。
我在这里错过了一些关键吗?