我理解"重新选择"背后的记忆概念,并用它来组成我的Redux选择器,但我不完全确定createSelector
如何"知道"组件选择器的数据何时发生了变化,以及在这些"子选择器"中包含其他函数调用是否会干扰createSelector
的记忆。
问题是,在"子选择器"中,也就是我传递给createSelector
的函数中,我需要执行一些基本检查,以确保JSON数据树的部分不是unedefined
(为此我使用了ramda
库),还需要按名称选择JSON数据树中的部分。也就是说,在"子选择器"getParksData
中,我正在调用其他模块中的existsAt
和nameToBlockData
。(我知道在下面的例子中,我只是从一个"子选择器"中作曲;稍后我会添加其他的)。
当我调用其他函数时,我是否仍然保留createSelector
的所有记忆功能?我需要以某种方式记住这些函数吗?感谢提供任何信息!
import { createSelector } from 'reselect';
import existsAt from '../../../utils/objectExistsAtPath';
import {
nameToBlockData,
HOME_DATA_FEATURE_PARKS,
} from '../../../api/json-name-to-block-data';
const R_BASE = 'home.data.blocks';
// eslint-disable-next-line
const getParksData = (state, position) => (existsAt(R_BASE, state) ? nameToBlockData(state.home.data.blocks, HOME_DATA_FEATURE_PARKS).sub_blocks.find(element => element.position === position) : {});
export default createSelector(
[getParksData],
(parksData) => (parksData),
);
createSelector
将计算所有输入选择器。如果它们是使用createSelector
创建的,那么它们也将被存储。
记忆化只检查输入参数,所以只要你的状态(或子状态)没有改变,你仍然可以从记忆化中受益。
注意,我调用了barSelector
两次,但getFoo
只执行了一次
const {
createSelector
} = Reselect
const getFoo = (thing) => {
console.log('getFoo')
return thing.foo
}
const state = {
foo: {
bar: 1
},
}
const fooSelector = state => getFoo(state)
const barSelector = createSelector(
fooSelector,
foo => foo.bar
)
console.log(barSelector(state))
console.log(barSelector(state))
<script src="https://cdnjs.cloudflare.com/ajax/libs/reselect/4.0.0/reselect.min.js"></script>