redux 理解选择器与重选和对象的记忆

puruo6ea  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(117)

Redux网站上有一篇关于Reselect库的选择器记忆的文章,他们提供了下一个例子:

const state = {
  a: {
    first: 5
  },
  b: 10
}

const selectA = state => state.a
const selectB = state => state.b

const selectA1 = createSelector([selectA], a => a.first)

const selectResult = createSelector([selectA1, selectB], (a1, b) => {
  console.log('Output selector running')
  return a1 + b
})

const result = selectResult(state)
// Log: "Output selector running"
console.log(result)
// 15

const secondResult = selectResult(state)
// No log output
console.log(secondResult)
// 15

字符串
总的来说,这个例子很清楚,除了selectA1选择器。
当你调用选择器时,Reselect将使用你给出的所有参数运行输入选择器,并查看返回值。如果任何结果与之前不同,它将重新运行输出选择器,并将这些结果作为参数传递。
所以,如果我们提供state.a,也就是对象,作为selectA1的输入选择器,它将失败===检查并每次运行a => a.first,对吗?或者我误解了什么?

af7jpaap

af7jpaap1#

所以,如果我们提供state.a,也就是对象,作为selectA1的输入选择器,它将失败===检查并每次运行a => a.first,对吗?
不,对象引用将 * 始终 * 严格等于自身。
selectA选择器函数返回state.a,它是对具有值{ first: 5 }的对象的引用。state.a将继续 * 始终 * 是对 * this * 对象的引用,直到调度一个动作来更新state.a,然后成为对具有值的 new**对象的引用, 然后 * selectA1选择器函数将重新计算其输出值。
我希望这段代码有助于说明对象引用相等性。

const state = {
  a: { first: 5 },
};

const selectA = state => state.a;

// same reference, true
console.log(selectA(state) === state.a);

// same "value", but false because different reference
console.log({ first: 5 } === state.a);

字符串

相关问题