首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用immer.js更新多个状态属性

如何使用immer.js更新多个状态属性
EN

Stack Overflow用户
提问于 2019-01-10 09:49:32
回答 3查看 8.5K关注 0票数 6

我想知道是否有可能在一个“调用”中使用immer.js更新多个状态属性。

说我有state

代码语言:javascript
复制
export const initialState = {
  isUserLogged: false,
  menuIsClosed: false,
  mobileMenuIsClosed: true,
  dataArray: ["dog","cat"],
};

action creator

代码语言:javascript
复制
export function updateSearchPage(data) {
  return {
    type: UPDATE_SEARCH_PAGE,
    payload: data
  };
}

然后,我在React组件中使用该action creator,如下所示:

代码语言:javascript
复制
  this.props.updateSearchPage({
    isUserLogged: true,
    menuIsClosed: true,
    dataArray: ["dog","cat","owl"]
  })

我的想法是,我想同时更新状态的几个属性。但我不知道它是哪一种预先的属性。我知道怎么用一个简单的减速机:

代码语言:javascript
复制
case UPDATE_SEARCH_PAGE:
  return Object.assign({}, state, action.payload)

但是how to update several properties of state with immer at the same time呢?当状态属性(应该更新的)是,未知的时。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-10 10:41:23

您可以在action.payload上循环如下所示:

代码语言:javascript
复制
const yourReducer = (state, action) =>
  produce(state, draft => {
    switch (action.type) {
      case UPDATE_SEARCH_PAGE:
        Object.entries(action.payload).forEach(([k, v]) => {
          draft[k] = v;
        })
        break;
    // ... other
    }
  }

还要记住,在最近版本的immer上返回一个对象是完全合法的,所以在一个return Object.assign({}, state, action.payload)调用中执行produce仍然有效。

票数 8
EN

Stack Overflow用户

发布于 2019-11-22 17:06:27

使用ES6,您可以这样做:

代码语言:javascript
复制
export const state = produce((draft, action) => {
  switch (type) {
    case UPDATE_SEARCH_PAGE:
      return {...draft, ...action.payload}
  }
}, initialState)

在这种情况下,它的工作方式与没有Immer一样。所有属性都将合并(浅合并)到状态。如果需要替换状态,只需返回action.payload

票数 4
EN

Stack Overflow用户

发布于 2019-01-10 10:09:32

Immer给出了一个可以编辑的草稿状态。在幕后,它使用ES6代理来发现您更改的内容,并以不可变的方式将您的编辑应用到原始状态。

基本上,您可以做与现在完全相同的事情,但是使用Immer:

代码语言:javascript
复制
import produce from 'immer'

const newState = produce(this.state, draft => Object.assign({}, draft, payload))

相反,如果您知道哪些属性发生了更改,则可以执行以下操作:

代码语言:javascript
复制
const newState = produce(this.state, draft => {
  draft.propertyOne = 'newValue'
  draft.propertyTwo = 42
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54125943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档