【问题标题】:Reducer not returning the expected empty object减速器没有返回预期的空对象
【发布时间】:2017-08-17 22:29:40
【问题描述】:

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

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

在删除之前,作业对象如下所示:

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;
}

为什么我的减速器失败了?

【问题讨论】:

    标签: javascript react-native redux react-redux


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      将您的操作更改为

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

      【讨论】:

        猜你喜欢
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多