存储阵列时未检测到状态的变化

时间:2016-09-17 03:34:27

标签: reactjs redux

我在我的商店中存储了一个数组,但是我的mapStateToProps没有检测到更改,并且更新了props。这是我的商店:

const INITIAL_STATE = 
{   
    someArray:[]
};

这是我的mapStateToProps。

function mapStateToProps(state){
  return{
      someArray: state.publications.someArray
  }
}

如果我添加一些东西来检测长度变化,它确实会检测到变化,但这显然是不正确的。我做错了什么?

 function mapStateToProps(state){
      return{
          someArray: state.publications.someArray,
          detectChange: state.publications.someArray.length
      }
    }

这是我的root reducer:

const rootReducer = combineReducers({
    publications: PUBLICATIONS_REDUCER

});

这是触发的reducer开关:

case UPDATE_INDEX_HEADER_SORT_ARRAY:
    return {...state, someArray: action.payload}

其中payload是数组。

1 个答案:

答案 0 :(得分:0)

您的reducer将有效负载直接置于状态。国家在任何时候都应该是不变的。但该州的阵列也被其他地方引用。代码不包括在内,但我设想了两个选项之一。

选项一是你有一些挂在数组上的变量,修改它以添加或删除项目,然后调度一个动作将该数组置于该状态。

选项二是某些函数从状态读取publications,继续推送,弹出或拼接此数组上的某些内容,然后调度操作以将该数组置于该状态。

在这两种情况下,你应该意识到一些事情:

  • 状态中的相同数组是您在状态中存储后要修改的数组。它只是一个引用,所以通过推送,弹出,拼接或设置任何项目的任何项目或属性,或者该数组中任何位置的后代属性,您正在改变状态。国家应该是不可改变的。
  • 当你将这个数组放入一个动作然后,在reducer中,将它存储在状态中时,你实际上没有做任何事情。您存储的阵列已存储在那里。它是相同的阵列。
  • 两种情况基本相同。

Redux不会查看您的数组以查看是否有任何更改。为此,需要搜索数组,数组中的项以及所有子项和子子项,一直向下搜索。 Redux会因为所有比较而疲惫不堪。通过强制该状态是不可变的,Redux使其变得容易。它可以只是check if the array is the same object as before,因为如果是,那么整棵树必须是相同的。毕竟,如果树中任何地方的任何属性发生了变化,那么其父级也必须已经更改,一直到根状态。如果你违反了与Redux的契约并试图通过变异来欺骗它,然后在一个动作的帮助下存储这个变异,那么Redux就不会对此有所帮助。

另外,在减速器之外使用你的阵列和烦恼表明你可能还没有完全理解Redux背后的原因。你可能觉得这个动作/减速器业务有点过头了,你只想推送一些东西,或者设置一个深层嵌套的属性。然后通过发送令牌动作来通知Redux,以便Redux可以感觉它被包含在聚会中。

Redux并不想仅仅作为事后的想法。像SET_ENTIRE_STATE这样的行为违背了Redux的目的和理念。我们鼓励您制作许多动作类型和许多细粒度减速器。这赋予了Redux权力,它会以实物的形式回报你,因为它很乐意与你分享它的力量。最好的部分:Redux很谦虚,它会让你获得所有的荣誉。

那就是说,你可以理解的是,你因为不可改变的任务而让你心爱的命令式风格从你身上夺走了。这就是我写Redux-Schema的原因。它允许您使用命令式样式编码,同时仍然在任何地方使用Redux Way。