【问题标题】:How to conditionally $merge or $set nested data in a redux reducer?如何在 redux reducer 中有条件地 $merge 或 $set 嵌套数据?
【发布时间】:2016-03-30 03:23:57
【问题描述】:

我有一个简单的SEARCH_SUCCESS reducer,updates api 响应到由 id 映射的状态,如下所示:

[searchActionTypes.SEARCH_SUCCESS]: (state, { companies }) => {
    return update(state, { $merge: _.indexBy(companies, '_id') })
},

但是,由于我的州是按 id 映射的,因此 替换该州的任何现有公司。这是一个问题,因为我想保留存储在该州现有公司中的额外数据。

我可以遍历公司并手动$merge state:

const newState = _.deepClone(state)
_.forEach(companies, company => newState[company._id] = state[company._id] ?
    update(state[company._id], { $merge: company }) : company
)
return newState

但这感觉很笨拙。有没有更优雅的方法来更新嵌套状态,如果键不存在,则有条件地 $merge$set

【问题讨论】:

  • 您链接到的问题是一个关于更新 redux 状态的通用问题,并接受了建议使用 react-addons-update 的答案。我已经在使用这个助手并在我的问题中链接到它。 Abramov(redux 的创建者)也响应并推荐了 normalizer。我的数据已经规范化,因此我按 ID 索引记录。
  • 澄清一下,我的问题解决了更新插件 $merge 运算符的一个缺点,因为它只合并浅层,很像 lodash assign。

标签: javascript reactjs redux


【解决方案1】:

经过一番折腾,我放弃了更新 $merge 运算符,因为它本质上等同于 lodash assign 并使用了 lodash cloneDeepmerge 的组合,如下所示:

[dupeSearchActionTypes.SEARCH_SUCCESS]: (state, { companies }) => {
  // manually _.merge companies into state because react-addons-update $merge is shallow
  return _.merge(_.cloneDeep(state), _.indexBy(companies, '_id'))
},

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2020-12-05
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多