【发布时间】:2017-03-30 04:28:20
【问题描述】:
根据我刚刚阅读并重新阅读的所有 Redux 和 Reselect 文档,如果 getThing() 返回的不可变映射不等于前一个,则以下选择器应该只执行 thing.toJS() 处理。
...
// 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 函数中进行深度相等检查。这很昂贵,而且似乎不是一个体面的解决方案。
应用程序状态被规范化,因此状态树的更新部分不是子组件所依赖的状态部分的分层父级。
我在这里遗漏了什么关键吗?
【问题讨论】:
-
您发布的代码看起来是正确的,应该按预期运行。请提供使用这些选择器并将您的
Components连接到store的代码。
标签: reactjs redux react-redux reselect