关于redux-toolkit中的extraReducers

extraReducers 是 Redux Toolkit 的 createSlice 函数中的一个高级特性,它允许 slice 处理由其他部分的应用程序生成的 action

extraReducers 在 Redux Toolkit 的 createSlice 函数中提供了三种主要方法来定义额外的 reducer 行为:

1.addCase(actionCreator, caseReducer):

这个方法允许你指定一个 action creator 和一个 case reducer 函数。当由 createSlice 生成的 action creator 被 dispatch 时,将调用相应的 case reducer 函数来更新状态。这主要用于处理由当前 slice 生成的 action。

2.addMatcher(matcher, caseReducer):

addMatcher 方法接受一个 matcher 函数和一个 case reducer 函数。matcher 函数用于判断传入的 action 是否符合特定条件,如果条件为真,则调用 case reducer 函数来更新状态。这可以用于处理不是由当前 slice 生成的 action,而是基于 action 的结构或内容。

3.addDefaultCase(defaultCaseReducer):

addDefaultCase 方法允许你指定一个默认的 case reducer 函数。当没有其他 case reducer 或 matcher 匹配当前的 action 时,将调用这个默认的 case reducer 函数。这可以作为一个“兜底”逻辑,用于处理所有其他 reducer 未处理的 action。

import {createAction, createAsyncThunk, createSlice} from "@reduxjs/toolkit";

//额外的异步函数
export const userInformation2 = createAsyncThunk('user/userInformation2', async (arg, thunkAPI) => {
    console.log("执行了异步函数,userInformation2")
    return new Promise(resolve => {
        resolve({userId: 2, userName: 'fs2', email: 'fs2@gmail.com'})
    }).then((res) => {
        return res
    })
})

//创建一个函数
export const userInformation3 = createAction('user/userInformation3')

//创建一个未知的action
export const userInformation4=createAction('user/userInformation4')

const userInformation = createSlice({
    name: "userInformation",
    initialState: {
        userId: 1,
        userName: null,
        email: null,
    },
    reducers: {
        addUserInformation(state, action) {
            return {
                ...action.payload
            }
        },
        removeUserInformation(state, action) {
            console.log("删除信息")
            return {
                ...action.payload
            };
        }
    },
    extraReducers: (builder) => {
        //判断dispatch的类型是否触发
        //类型守卫
        function isRejectedAction(action) {
            console.log(action.type.endsWith('addUserInformation'))
            return action?.type.endsWith('addUserInformation');
        }
        //
        builder.addCase(userInformation2.fulfilled, (state, action) => {
            console.log("执行了异步函数,userInformation2.fulfilled", state, action)
            console.log(state)
            console.log(action)
            return {
                ...action.payload,
            }
        });
        builder.addCase(userInformation3, (state, action) => {
            console.log("createAction3", state, action)
            return {
                ...action.payload
            }
        })
        //isRejectedAction为true则执行后面的函数
        builder.addMatcher(isRejectedAction, (state, action) => {
            console.log("addUserInformation触发了")
        })
        //未知的action被触发时执行
        builder.addDefaultCase((state, action) => {
            console.log(`Received unknown action type: ${action.type}`);
            // 假设我们想在 state 中跟踪未知 action 的次数
        });
    }
})
export const {addUserInformation, removeUserInformation} = userInformation.actions
export default userInformation.reducer;

要安装redux-toolkit,你可以按照以下步骤进行操作: 1. 在你的项目打开终端或命令行界面。 2. 运行以下命令来安装redux-toolkit: ``` npm install @reduxjs/toolkit ``` 或者如果你使用的是yarn,可以运行以下命令: ``` yarn add @reduxjs/toolkit ``` 3. 安装完成后,你可以在你的代码引入redux-toolkit的configureStore函数,例如: ```javascript import { configureStore } from '@reduxjs/toolkit'; ``` 4. 接下来,你可以使用configureStore函数来创建和配置你的Redux store。你可以在reducer参数传入你的reducer函数,或者使用combineReducers函数来合并多个reducer。例如: ```javascript import { configureStore, combineReducers } from '@reduxjs/toolkit'; // 导入你的reducer函数 import counterReducer from './reducers/counterReducer'; import todosReducer from './reducers/todosReducer'; // 合并多个reducer const rootReducer = combineReducers({ counter: counterReducer, todos: todosReducer, }); // 创建Redux store const store = configureStore({ reducer: rootReducer, }); ``` 5. 现在你已经成功安装了redux-toolkit并创建了Redux store,你可以在你的React组件使用Provider组件来将store传递给你的应用程序。例如: ```javascript import React from 'react'; import { Provider } from 'react-redux'; import store from './store'; import App from './App'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ); ``` 这样,你就可以在你的React组件使用Redux store了。 #### 引用[.reference_title] - *1* *3* [redux toolkit 傻瓜教学](https://blog.csdn.net/wangyangnuli/article/details/122520675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Redux流程分析 传统流程和redux-toolkit的使用](https://blog.csdn.net/qq_23539691/article/details/119720636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值