传递给"重新选择"的函数是否可以包含其他选择器和函数,并且仍然保留 createSelector 记忆的好处?



我理解"重新选择"背后的记忆概念,并用它来组成我的Redux选择器,但我不完全确定createSelector如何"知道"组件选择器的数据何时发生了变化,以及在这些"子选择器"中包含其他函数调用是否会干扰createSelector的记忆。

问题是,在"子选择器"中,也就是我传递给createSelector的函数中,我需要执行一些基本检查,以确保JSON数据树的部分不是unedefined(为此我使用了ramda库),还需要按名称选择JSON数据树中的部分。也就是说,在"子选择器"getParksData中,我正在调用其他模块中的existsAtnameToBlockData。(我知道在下面的例子中,我只是从一个"子选择器"中作曲;稍后我会添加其他的)。

当我调用其他函数时,我是否仍然保留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>

最新更新