Reactjs 重新选择的createSelector:它是否对嵌套对象进行深度比较?

Reactjs 重新选择的createSelector:它是否对嵌套对象进行深度比较?,reactjs,react-redux,reselect,Reactjs,React Redux,Reselect,如果redux中的“第二个”(嵌套对象)发生更改怎么办? 如果它做了肤浅的比较,它应该忽略变化,而不是重新招标 我在doc中看到的所有示例都是基于简单对象的,其中浅层比较是可以的 // assume state is: {data: {first : {second { } } }} const selectData = state => state.data; const selectSecond = createSelector( selectData, data

如果redux中的“第二个”(嵌套对象)发生更改怎么办? 如果它做了肤浅的比较,它应该忽略变化,而不是重新招标

我在doc中看到的所有示例都是基于简单对象的,其中浅层比较是可以的

// assume state is:  {data: {first : {second { } } }}

const selectData = state => state.data;

const selectSecond = createSelector(
    selectData,
    data => data
);


createSelector
使用,这意味着当且仅当两个对象是对内存中同一对象的引用时,才认为它们“相等”。这与React在比较
状态
或比较
使用效果
依赖项时使用的检查类型相同

浅相等意味着,如果两个对象的所有属性都严格相等,则它们是相等的

深度相等意味着如果两个对象的内容相同,则无论对象引用如何,它们都是相等的。由于数据的不可变性质,React或Redux几乎不需要它,因此计算成本很高


Redux状态被认为是不可变的,因此您永远不会遇到对象在内存中是同一引用但具有不同内容的情况。每次属性更改时,都必须创建新对象。如果
第二个
已更改,则
第一个
数据
将成为新对象

如果redux中的“第二个”(嵌套对象)发生更改怎么办?如果它做了肤浅的比较,它应该忽略变化,而不是重新招标

只有在你所在的州发生了变异,你才会有这个问题。只要减速器是正确的,那么只要
state.data
发生更改,就会得到重新渲染器,因为任何更改都需要创建新对象

state => ({...state, nested: {...state.nested}})
state => ({...state, number: 5})

以下是各种平等性检查的几个示例:

state => state
状态
是严格相等、浅相等和深相等

state => ({...state})
状态
是浅相等和深相等。它不是严格相等的,因为它是一个新对象

state => ({...state, nested: {...state.nested}})
state => ({...state, number: 5})
状态
深度相等。它不是严格相等或浅相等,因为
nested
属性是一个新对象

state => ({...state, nested: {...state.nested}})
state => ({...state, number: 5})
状态
的属性已更改,因此无法通过所有相等性检查

state => {
  state.nested.number = 5;
  return state;
}
这是React或Redux中不允许的突变类型<代码>状态是严格相等的,因为我们返回了相同的
状态
对象。它也是相等的,因为
state.nested
是同一个对象。它不是深度相等(除非之前的值是5)


同样,这是不允许的。如果对顶级属性进行变异,则
state
是严格相等的,而不是浅相等或深相等。

state
的所有更新都是不可变的,因此如果
second
发生更改,则
first
data
也将成为新对象。感谢您的详细解释,它确实明确了几个概念。是的,我们正在使用这种模式
state=>({…state,nested:{…state.nested}})
,因此我在您的反馈后的理解是:1)如果嵌套对象已更新,并且不需要进行深度/浅层比较,则createSelector默认相等检查就足够了。2) 对于useSelector,我们应该使用shallowEqual作为第二个参数,而不需要像lodash.isEqual这样的深入比较。3) 简单地说,如果redux状态是不可变的,我们不需要与createSelector或useSelector进行深入比较。我做对了吗?
state => ({...state})