reactjs - RTK Toolkit 如何通过 createSlice 将构建器语法与 Action 创建器一起使用?

标签 reactjs typescript redux react-redux redux-toolkit

我在 Redux 方面经验丰富,但对 Redux Toolkit (RTK) 和 createSlice 完全陌生。我正在尝试遵循官方 RTK 查询文档上的教程,但我迷路了。

我已经创建了我的操作:(假设有一种名为“模型”的类型)

const setModel = createAction<Model>('setModel');

然后我定义了我的状态:

type MyState = {
  model: Model;
}

const initialState: MyState = {
  model: models[0], // points to a valid object of type Model
};

然后我尝试创建我的切片:

export const mySlice = createSlice({
  name: 'x',
  initialState,
  reducers: {
        
  },
  extraReducers: builder => {
    builder.addCase(setModel, (state, action) => {
      state.model = action.payload;
      return state;
    });
  },
});

文档似乎推荐使用 extraReducers 方法直接与操作对象和构建器一起使用,这似乎也隐式支持 Immer。所以我为 setModel 编写了简单的案例。但是,当我尝试在组件中使用它时:

const dispatch = useDispatch();
dispatch(mySlice.actions.setModel(pickedItem));

mySlice.actions 为空,并且不包含名为 setModel 的条目。这不是 TypeScript 问题,运行时设置断点也会显示它确实是空的:

enter image description here

然后我读了更多内容,听说 extraReducers 不会创建 Action 创建者,而 reducers 会创建(这可能解释了为什么我的 Action 是空的)。但是,这样我就无法使用 RTK Toolkit 首先推荐的构建器语法。

此时我完全迷失了。

如何将 createSlice 与强类型和自动生成的操作创建器一起使用,或者如果不可能,那么 createSlice 的推荐模式是什么?

最佳答案

How can I use createSlice with strongly-typed and autogenerated action creators?

您可以在切片中输入 reducer 的有效负载,将为您生成操作并正确输入。

示例:

import { createSlice } from '@reduxjs/toolkit';
import type { PayloadAction } from '@reduxjs/toolkit';

type MyState = {
  model: Model;
}

const initialState: MyState = {
  model: models[0],
};

const mySlice = createSlice({
  name: 'x',
  initialState,
  reducers: {
    setModel: (state, PayloadAction<Model>) => {
      state.model = action.payload;
    },
  },
});

export const {
  setModel
} = mySlice.actions;

export default mySlice.reducer;

extraReducers 主要用于处理外部操作,例如异步操作和其他切片生成的操作。

关于reactjs - RTK Toolkit 如何通过 createSlice 将构建器语法与 Action 创建器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76268584/

相关文章:

javascript - typescript 编译 vendor ,排除不起作用

angularjs - Angular 2动态生成的表单组

reactjs - 清除浏览器数据后无法在 Object.extractRehydrationInfo 读取未定义的属性(读取 [api.reducerPath])

javascript - 未捕获的类型错误 : Cannot read property 'type' of undefined at start of switch function

javascript - 使用 lambda 发送 html 文件会产生语法错误,但只是有时

javascript - 如何在 Bower 中包含 ReactDOM

javascript - 如何 stub Typescript 接口(interface)/类型定义?

javascript - React-Redux 如何根据成功条件调用新的调度

javascript - 我是否总是需要从 redux 中间件返回一个值?

javascript - 如何使用 React 呈现不同的布局?