传递给“重新选择”的函数是否可以包含其他选择器和函数,并且仍然保留createSelector备忘录的好处?

时间:2019-02-03 13:26:03

标签: reactjs redux reselect

我了解'reselect'背后的记忆概念,并正在使用它构成我的Redux选择器,但是我不确定createSelector如何“知道”组件选择器的数据何时更改以及是否包含其他选择器这些“子选择器”中的函数调用会干扰createSelector的记忆。

问题在于,在“子选择器”(即我要传递给createSelector的函数中)中,我需要执行一些基本检查,以确保JSON数据树的部分不是{{ 1}}(为此,我使用了unedefined库),还通过名称​​选择 JSON数据树的一部分。也就是说,在“子选择器” ramda中,我正在调用其他模块中的getParksDataexistsAt。 (我知道在下面的示例中,我仅由一个“子选择器”组成;稍后将添加其他子选择器)。

当我调用其他函数时,我仍然保持nameToBlockData的所有备注好处吗?我需要以某种方式记住那些功能吗?感谢您提供任何信息!

createSelector

1 个答案:

答案 0 :(得分:1)

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>