Reducer不返回预期的空对象

时间:2017-08-17 13:51:41

标签: javascript react-native redux react-redux

在这里使用React-redux并遇到一些问题,你们中的一些人可能会帮忙。

用户可以创建“作业”(帖子)并删除它们。添加它们没有问题,reducer返回预期的结果。但是,一旦我从(firebase)数据库中删除了一个作业,我就会为当前作业触发一个新的提取,但是reducer仍会返回旧的作业。我错过了什么吗?

在删除之前,这就是作业对象的样子:

activeJobs= {
  -KrkPPy4ibSraKG-O49S: {
    title: 'Help',
    location: 'etc,
    ...
  },
  -KrkPPy4ibSraKG-O49S: {
    title: 'Help',
    location: 'etc,
    ...
  } and so on
}

当我删除它们时,我从服务器返回{}。预期。 不期望的是我的reducer仍然返回旧的作业,而我的组件不会重新渲染。

我在获取作业后发送一个动作:

firebase.database().ref(`/jobs/activeJobs/${currentUser.uid}`)
      .on('value', snapshot => {

        console.log('new activeJobs ===', snapshot.val());

        dispatch({
          type: FETCH_JOBS_SUCCESS,
          payload: snapshot.val()
        });
      });

snapshot.val()确实包含新更新的作业。

然后这是处理动作的reducer:

switch (action.type) {
case FETCH_JOBS_SUCCESS:

  // ...state contains the OLD jobs and action.payload contains {}. Why is is not overriding it the old jobs?

  return { ...state, ...action.payload  };
default:
  return state;
}

为什么我的减速机出现故障?

2 个答案:

答案 0 :(得分:2)

{ ...state, ...action.payload }语法实际上意味着:通过采用state的每个道具并添加action.payload的每个道具来构建新对象。在您的情况下,您只需获得一个与state类似的新对象,因为...action.payload是一个空对象。

答案 1 :(得分:0)

将您的操作更改为

return Object.assign({}, state, {activeJobs : action.payload});