如何使用 Redux Toolkit 从 Redux 状态中删除数组中的单个元素?

4

我正在使用redux-toolkit库中的createSlice()函数添加和删除数组中的项目。

addProject reducer函数工作正常,但removeProject不起作用。

// projects.js

import { createSlice } from "@reduxjs/toolkit";

let lastId = 0;

const slice = createSlice({
  name: "projects",
  initialState: [],
  reducers: {
    projectAdded: (projects, action) => {
      projects.push({
        id: ++lastId,
        name: action.payload.name,
      });
    },
    projectRemoved: (projects, action) =>
      (projects = projects.filter((pro) => pro.id !== action.payload.id)),
  },
});
export const { projectAdded, projectRemoved } = slice.actions;
export default slice.reducer;

//store.js

import { configureStore } from "@reduxjs/toolkit";
import reducer from "./projects";
const store = configureStore({ reducer: reducer });

export default store;

//index.js

import store from "./store/store";
import { projectAdded, projectRemoved } from "./store/projects";
const unsubscribe = store.subscribe(() => {
  console.log("store Changed", store.getState());
});
store.dispatch(projectAdded({ name: "Project 1" }));
store.dispatch(projectRemoved({ id: 1 }));

1个回答

4
你正在替换状态树的根对象(projects)- 这会破坏 immer 的变更检测功能。
最简单的方法是直接返回筛选后的数组,不要先赋值到草稿对象中:
projectRemoved: (projects, action) => projects.filter((pro) => pro.id !== action.payload.id),


参见: https://immerjs.github.io/immer/docs/update-patterns#array-mutations

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接