我收到第二个构建器的错误,它说:Uncaught TypeError: typeOrActionCreator is undefined.我不知道该构建器出了什么问题.当我删除该构建器时,它会错误地识别下一个构建器.(请注意,我从最后一个构建器中发送了我的thunkClose)

export const updateSelectedOrNewMovementData = ("myMovements/updateSelectedOrNewMovementData", async(allData) => {
    const {data, type, motion_id} = allData
    try{
        const {receivedData} = await patchRequest(`/coach/motion/${motion_id}`, data)
        return type
    }
    catch (err) {
        console.error("err", err.response.data.message);
    }
})

...here there are codes for my slice.

extraReducers(builder) {
        builder
            .addCase(handleGetMyMovements.fulfilled, (state, action) => {
                const data = action.payload;
                if (data?.length > 0) {
                    state.myMovements = [...state.myMovements, ...data];
                    state.myMovementsTemp = [...state.myMovements, ...data];
                }
                if (data?.length >= 20) {
                    state.status.isNotMoreData = true;
                } else {
                    state.status.isNotMoreData = false;
                }
                state.status.myMovementsLoading = false;
            })
            .addCase(handleGetMyMovements.pending, (state, action) => {
                state.status.myMovementsLoading = true;
            });
        builder
            .addCase(updateSelectedOrNewMovementData.fulfilled, (state, action) => {
                if (action?.payload === "formData") {
                    state.status.selectedOrNewMovementLoading = "sentData"
                    setTimeout(() => {
                        state.status.selectedOrNewMovementLoading = false
                        window.history.back();
                    }, 3000);
                }
            })
            .addCase(updateSelectedOrNewMovementData.pending, (state, action) => {
                if (action?.payload === "formData") {
                    state.status.selectedOrNewMovementLoading = true
                }
            })
            .addCase(updateSelectedOrNewMovementData.rejected, (state, action) => {
                state.status.selectedOrNewMovementLoading = "error"
            });
        builder
            .addCase(createNewMovement.fulfilled, (state, action) => {
                const payload = action?.payload
                const dispatch = payload?.dispatch
                state.status.selectedOrNewMovementLoading = false
                if (payload?.data?.is_successful) {
                    state.motionId = payload?.data?.motion_id
                    dispatch(updateSelectedOrNewMovement({
                        data: payload?.myForm,
                        type: "formData",
                        motion_id: payload?.data?.motion_id
                    }))
                    dispatch(updateSelectedOrNewMovement({
                        data: payload?.textFormBody,
                        type: "rawData",
                        motion_id: payload?.data?.motion_id
                    }))
                }
            })
            .addCase(createNewMovement.pending, (state, action) => {
                state.status.selectedOrNewMovementLoading = true
            })
            .addCase(createNewMovement.rejected, (state, action) => {
                state.status.selectedOrNewMovementLoading = "error"
            })
    },

推荐答案

在Redux中,您永远不允许从减速器内部进行调度.对于执行setTimeout这样的同步逻辑也是如此.

减速器逻辑必须是一个纯同步功能,没有副作用.

您可能想在thunk中或使用监听器中间件来执行当前正在执行的逻辑.

话虽如此,您所面临的问题是因为您传递给您的.addCase个呼叫之一的操作之一似乎是undefined.

这可能是由于你的updateSelectedOrNewMovementData是正常功能造成的.它不是spirc thunk,所以它没有pendingfulfilledrejected属性.您必须使用createAsyncThunk来实现这一点.

- export const updateSelectedOrNewMovementData = ("myMovements/updateSelectedOrNewMovementData", async(allData) => {
+ export const updateSelectedOrNewMovementData = createAsyncThunk("myMovements/updateSelectedOrNewMovementData", async(allData) => {

坦率地说,很多代码看起来都是正确的,但却犯了很多小错误,表明您缺少一些重要的基础知识.

我建议您阅读Redux Essentials教程并遵循这些教程,以很好地掌握Redux数据流.

Reactjs相关问答推荐

为什么VScode中的React应用程序无法识别文件夹 struct ?

Reaction路由的问题-在Effect使用API调用响应设置状态之前呈现页面

是否将样式应用于父悬停(框架运动)上的子元素?

Npm运行构建`在Next.js 14中不起作用

try 在Dockerfile中使用AWS CLI将React构建工件上传到S3时出错

如何创建react router v6的自定义子路由?

无法在主组件的返回语句中呈现预期组件

React Context未正确更新

自定义变量默认、聚焦和填充时所需TextField中标签的星号 colored颜色

我在Route组件上使用元素属性,这样就不需要ID了吗?

使用 React + Vite 范围化 CSS

React 错误: 只能用作 元素的子元素,从不直接渲染.请将您的 包裹在

有没有办法在 React Router v6 中的路由匹配上运行一些逻辑/功能?

如果我使用 formik,如何在嵌套对象中写入正确的值?

将水平滚动视图添加到底部导航选项卡

cypress `cy.now()` Type 'Promise' 没有调用签名

在 React 的父级中多次调用子级时从子级获取数据到父级

list 组件未按预期运行

刷新页面时状态改变问题

Select MenuItem 时 Material-ui 不更改样式