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
,对吗?或者我误解了什么?
1条答案
按热度按时间af7jpaap1#
所以,如果我们提供
state.a
,也就是对象,作为selectA1
的输入选择器,它将失败===
检查并每次运行a => a.first
,对吗?不,对象引用将 * 始终 * 严格等于自身。
selectA
选择器函数返回state.a
,它是对具有值{ first: 5 }
的对象的引用。state.a
将继续 * 始终 * 是对 * this * 对象的引用,直到调度一个动作来更新state.a
,然后成为对具有值的 new**对象的引用, 然后 *selectA1
选择器函数将重新计算其输出值。我希望这段代码有助于说明对象引用相等性。
字符串