Redux-Toolkit的使用

使用普通的Redux写法的缺点:代码量过多,不利于管理,编写逻辑过于的繁琐和麻烦。Redux-Toolkit 是官方推荐的编写 Redux 逻辑的方法。

安装:

npm install @reduxjs/toolkit react-redux

1.Redux-Toolkit核心的API

  • configureStore:

    用于创建store对象。包装createStore以提供简化的配置选项和良好的默认值。可以自动组合划分的reducer,还可以添加我们自己提供的任何 Redux 中间件。其中redux-thunk默认包含,并自动启用 Redux DevTools Extension。

    • reducer:将slice中的reducer可以组成一个对象传入此处

    • middleware:可以使用参数,传入其他的中间件

    • devTools:是否配置devTools工具,默认为true

import { configureStore } from "@reduxjs/toolkit";
import counterReducer from './features/counter'

const store = configureStore({
  reducer: {
    counter: counterReducer
  }
})

export default store
  • createSlice:接受reducer函数的对象、切片名称和初始状态值,并自动生成切片reducer,并带有相应的actions。createSlice主要包含如下几个参数:
    • name:用户标记slice的名词

    • initialState:第一次初始化时的值

    • reducers:相当于之前的reducer函数,对象类型,并且可以添加很多的函数。函数其实相当于redux写法的reducer中的一个case语句。函数中有两个参数:1.state,state的旧值;2.调用这个action时,传递的action参数。

createSlice返回一个对象,该对象包含所有的action和一个reducer

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

const counterSlice = createSlice({
  name: 'counter',
  initialState: {
    counter: 888
  },
  reducers: {
    addNumber(state, { payload }) {
      state.counter += payload
    },
    subNumber(state, { payload }) {
      state.counter -= payload
    }
  }
})

export const { addNumber, subNumber } = counterSlice.actions
export default counterSlice.reducer

2.Redux-Toolkit的异步操作

使用redux进行异步操作的时候我们需要使用redux-thunk中间件。现在Redux Toolkit默认已经继承了redux-thunk中间件,并暴露了一个函数createAsyncThunk

createAsyncThunk函数创建出来的action被dispatch出来时有三个状态

  • pending:action被发出,但是还没有最终的结果;

  • fulfilled:获取到最终的结果(有返回值的结果);

  • rejected:执行过程中有错误或者抛出了异常;

基本使用:

createAsyncThunk函数的第二个参数接收一个回调函数,该回调函数可传入两个参数,第一个是调用dispatch时,传入的一些数据,第二个是创建的store,我们可以在store中拿到dispatch调用reducer。也可以通过extraReducers来监听状态进而改变state值。

export const getHomeMultidataAction = createAsyncThunk('home/multidata', async (params, store) => {
  const res = await axios.get('http://xxx')
  return res.data
})

dispatch后返回三种状态

const mapDispatchToProp = (dispatch) => ({
  getHomeMultidata() {
    dispatch(getHomeMultidataAction(null))
  }
})

然后我们可以在createSlice的extraReducers中监听这些结果。

常用的方式:

  extraReducers: {
    [getHomeMultidataAction.pending](state, action) {
      console.log('getHomeMultidataAction pending', action);
    },
    [getHomeMultidataAction.fulfilled](state, action) {
      console.log('getHomeMultidataAction fulfilled', action);
      // 修改state的值,可直接复制修改,不需要重新返回一个对象
    },
    [getHomeMultidataAction.rejected](state, action) {
      console.log('getHomeMultidataAction rejected', action);
    }
  },

第二种方式:

  extraReducers(builder) {
    builder.addCase(getHomeMultidataAction.pending, (state, { payload }) => {
      console.log('getHomeMultidataAction pending', payload);
    }).addCase(getHomeMultidataAction.fulfilled, (state, { payload }) => {
      console.log('getHomeMultidataAction fulfilled', payload);
    })
  }

第三种方式:

export const getHomeMultidataAction = createAsyncThunk('home/multidata', async (params, store) => {
  const res = await axios.get('http://xxx')
  store.dispatch(homeSlice.actions.changeBannersAction())
  store.dispatch(homeSlice.actions.changeRecommendsAction())
  return res.data
})

注意:使用react-reducer修改state值时,需要返回一个全新的对象,但是在Redux-Toolkit中,我们可以直接通过赋值来修改。下面则是直接可以赋值的原因。

3.Redux-Toolkit的数据不可变性

 原理:它并不是通过浅拷贝的方式来完成修改值的操作,使用浅拷贝的方式时当遇到过大的对象,进行浅拷贝也会造成性能的浪费;还有浅拷贝后的对象,在深层改变时,依然会对之前的对象产生影响。 事实上Redux Toolkit底层使用了immerjs的一个库来保证数据的不可变性,当数据被修改时,会返回一个对象,但是新的对象会尽可能的利用之前的数据结构而不会对内存造成浪费

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装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、付费专栏及课程。

余额充值