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

标签 reactjs redux immer.js

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

假设我有状态:

export const initialState = {
  isUserLogged: false,
  menuIsClosed: false,
  mobileMenuIsClosed: true,
  dataArray: ["dog","cat"],
};

Action 创建者:

export function updateSearchPage(data) {
  return {
    type: UPDATE_SEARCH_PAGE,
    payload: data
  };
}

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

  this.props.updateSearchPage({
    isUserLogged: true,
    menuIsClosed: true,
    dataArray: ["dog","cat","owl"]
  })

这个想法是我想同时更新状态的多个属性。但我事先并不知道它是哪些属性。我知道如何使用简单的 reducer 来做到这一点:

case UPDATE_SEARCH_PAGE:
  return Object.assign({}, state, action.payload)

但是如何使用immer同时更新状态的多个属性?当状态属性(应该更新哪一个)事先未知时。

最佳答案

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

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) 中仍然有效>产生调用。

关于reactjs - 如何使用 immer.js 更新多个状态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54125943/

相关文章:

javascript - ReactJS - 销毁旧的组件实例并创建新的

node.js - 如何用 fetch api 正确替换 axios api 并映射到 nodeJS 中接收到的数据?

angular - 使用 mutate() 时,为什么 Angular 信号不运行我的自定义 'equal' 检查?

javascript - 将 Immer 与 NgRx reducer 集成

javascript - 在 react 中更新状态时递归太多

javascript - React componentDidMount 导致条件 View 初始闪烁

javascript - Redux:在 2D 数组上使用 Spread 运算符

reactjs - redux-form 值得在 apollo-react-redux 应用程序中使用吗?

reactjs - Immer 是否允许我们在 redux reducer 中存储类实例?

javascript - JSX 中的 className 属性是什么意思?