更新Redux状态不会触发componentWillReceiveProps

更新Redux状态不会触发componentWillReceiveProps,redux,Redux,我正在尝试验证登录信息。确保登录有效后,我想启动一个新路由。 我将state.loginReducer.login作为道具传递。当我处理提交事件时,会调度一个操作,从而更改全局登录状态 在这种情况下,组件不应该被触发吗?因为道具变了?。是否有更好的方法实现此功能 handleSubmit(evt){ 常数{ 派遣, 登录 }=这是道具; 分派(actions.doLogin(value.login)); } 组件将接收道具(下一步){ 常数{ 登录 }=this.nextProps; 如果(登录

我正在尝试验证登录信息。确保登录有效后,我想启动一个新路由。 我将state.loginReducer.login作为道具传递。当我处理提交事件时,会调度一个操作,从而更改全局登录状态

在这种情况下,
组件不应该被触发吗?因为道具变了?。是否有更好的方法实现此功能

handleSubmit(evt){
常数{
派遣,
登录
}=这是道具;
分派(actions.doLogin(value.login));
}
组件将接收道具(下一步){
常数{
登录
}=this.nextProps;
如果(登录名!=null){
pushState({},'/account');
}
}
函数MapStateTops(状态){
返回{
登录名:state.loginReducer.login
}
}
导出默认连接(MapStateTops)(登录);

如果
state.loginReducer.login
发生更改,则将触发
组件接收道具。如果您认为减速器正在返回新状态,并且未触发
组件WillReceiveProps
,请确保新状态是不可变的。返回传递给减速器的相同状态引用将不起作用

这是错误的:

function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    // Wrong! This mutates state
    state.push({
      text: action.text,
      completed: false
    });
  case 'COMPLETE_TODO':
    // Wrong! This mutates state[action.index].
    state[action.index].completed = true;
  }

  return state;
}
这是正确的:

function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    // Return a new array
    return [...state, {
      text: action.text,
      completed: false
    }];
  case 'COMPLETE_TODO':
    // Return a new array
    return [
      ...state.slice(0, action.index),
      // Copy the object before mutating
      Object.assign({}, state[action.index], {
        completed: true
      }),
      ...state.slice(action.index + 1)
    ];
  default:
    return state;
  }
}
应该是

componentWillReceiveProps (nextprops)
C
应该是小写。实际上,
mapstatetops
触发器
组件将接收props
。我确信这一点

执行以下操作:

函数MapStateTops(状态){
返回{
login:Object.assign({},state.loginReducer.login),
}
}

为了确保返回的对象实际上是
new

,最明显的解决方案是使用回调(这就是我现在正在做的),但我仍然不确定在这种情况下是否不会触发CWRP。您是否将
MapStateTops
定义为类方法?确保您没有意外地传入
未定义的
进行连接。这是死机。在我的例子中,问题是我正在这样做--
返回Object.assign(state,{key:newValue})
--而不是--
返回Object.assign({},state,{key:newValue})。这里的诀窍是用旧对象启动
Object.assign
,更新该对象,而不是返回新对象,因此Redux似乎认为没有任何变化,即使对象的数据发生了变化(因为标识符保持不变)。@Sasha谢谢,你的评论实际上帮助了我。我正在用相同的键创建一个新对象。其中一个键包含一个经过变异的数组,但实际上是对前一个状态的旧数组的引用。在我的情况下,我的方法肯定是正确的,但CWRP不会被触发。在我的异步更改之前,上一个CWRP在旧状态下显示
this.state
nextState
,更改之后,下一个CWRP在新状态下显示这两个状态。我从来没有看到过
此状态。旧状态为
而新状态为
nextState
。请查看此问题,我将感谢您的帮助:-
componentWillReceiveProps (nextprops)