是什么

是一个基于redux封装的一个状态管理工具集,目的是简化redux开发流程。提供了一些选项来配置全局store,并通过尽可能地抽象Redux API来更精简地创建actions和reducers。

Redux Toolkit API的主要功能?

以下是Redux Took Kit使用的API函数,它是现有Redux API函数的抽象。这些函数并没有改变Redux的流程,只是以更易读和管理的方式简化了它们。

  • configureStore:像从Redux中创建原始的createStore一样创建一个Redux store实例,但接受一个命名的选项对象并自动设置Redux DevTools扩展。
  • createAction:接受一个Action类型字符串,并返回一个使用该类型的Action创建函数。
  • createReducer:接受初始状态值和Action类型的查找表到reducer函数,并创建一个处理所有Action类型的reducer。
  • createSlice:接受一个初始状态和一个带有reducer名称和函数的查找表,并自动生成action creator函数、action类型字符串和一个reducer函数。

您可以使用上述API简化Redux中的样板代码,尤其是使用**createAction****createReducer**方法。然而,这可以使用createSlice进一步简化,它可以自动生成action creatorreducer函数。

使用

下载安装

  1. $ yarn add @reduxjs/toolkit react-redux

配置store

  1. // 配置redux-toolkit-store
  2. import { configureStore } from "@reduxjs/toolkit";
  3. import cartReducer from './modules/cart';
  4. import todoReducer from './modules/todoList';
  5. export const store = configureStore({
  6. // reducer 类似vuex的modules
  7. reducer: {
  8. //小的reducer(其实就是模块数据)
  9. //key(数据切片的名称或者命名空间):value(管理该数据切片的reducer)
  10. cart: cartReducer,
  11. todo: todoReducer
  12. }
  13. })
  1. //配置购物车对应的reducer 模块数据
  2. import { createSlice } from '@reduxjs/toolkit';
  3. import cartApi from '../../apis/shopcart';
  4. const cartSlice = createSlice({
  5. //当前模块type的命名空间
  6. name: 'cart',
  7. // 当前模块的数据
  8. initialState: {
  9. list: []
  10. },
  11. // 修改模块数据的方法
  12. reducers: {
  13. /*
  14. 这里的函数名称就是action type 只是再外面使用的使用需要加上命名空间
  15. 例如:cart/delProduct
  16. dispatch({
  17. type:"cart/delProduct",
  18. payload:1
  19. })
  20. 修改当前模块数据的逻辑(必须是同步的)
  21. */
  22. setList (state, action) {
  23. state.list = action.payload;
  24. }
  25. }
  26. })
  27. // console.log('cartSlice', cartSlice);
  28. //actions对象里面保存的都是action creator 即执行过后返回值是一个action对象的函数
  29. export const { changeNum, delItem, setList } = cartSlice.actions;
  30. /* 异步请求方法 */
  31. // 获取购物车数据
  32. export const getCartDataAsync = () => async (dispatch) => {
  33. const res = await cartApi.getCartData();
  34. // console.log(res);
  35. dispatch(setList(res.data));
  36. }
  37. export default cartSlice.reducer;

组件中使用

在组件树的顶层注入store数据

  1. import React from 'react'
  2. import store from '@/store/index';
  3. import {Provider} from 'react-redux';
  4. export default function App(){
  5. return(
  6. <Provider store={store}>
  7. ...你的其他组件,一般是根组件
  8. </Provider>
  9. )
  10. }

组件获取store数据修改

  • 类组件可以通过connect
  • 函数组件可以通过connect或者useSelectoruseDispatch
    1. import { useSelector, useDispatch } from 'reactredux';
    2. import { add, asyncAddAC } from '@/store/modules/counter';
    3. export default function Counter () {
    4. const count = useSelector(state => state.counter.c);
    5. const dispatch = useDispatch()
    6. return (
    7. <div>
    8. {count}
    9. <button onClick={() => dispatch(add(2))}>add</button>
    10. <button onClick={() => dispatch(asyncAddAC(3))}>async add</button>
    11. </div>
    12. )
    13. }
    ```javascript import React, { Component } from ‘react’ import { connect } from ‘react-redux’ import * as cartActions from ‘../../../reduxToolKitStore/modules/cart’

class Cart extends Component { componentDidMount () { this.props.dispatch(cartActions.getCartDataAsync()); } changeNum = (_id, type) => { this.props.dispatch(cartActions.changeNum({ _id, type })) } // 计算总价 get total () { let total = 0; this.props.list.forEach(item => { total += item.num item.price; }) return total; } render () { // console.log(this.props); return (

{ this.props.list.map(item => { return ( ) }) }
商品名 单价 数量 小计 操作
{item.name} {item.price} {item.num} {item.num item.price}
总价:{this.total}
) } }

const mapStateToProps = (state) => { // console.log(state); return { list: state.cart.list } } export default connect(mapStateToProps)(Cart)

  1. <a name="Wv6Gl"></a>
  2. ### 配置中间件
  3. <a name="q4174"></a>
  4. #### 下载中间件
  5. <a name="iMKvb"></a>
  6. #### 配置
  7. ```javascript
  8. import { configureStore } from '@reduxjs/toolkit'
  9. import logger from 'redux-logger';
  10. //配置store
  11. import counter from './modules/counter';
  12. import cart from './modules/cart';
  13. const store = configureStore({
  14. //reducer模块 统一在这里配置,类似vuex中的modules
  15. reducer: {
  16. //key(该数据切片的名称):value(管理该数据切片的reducer)
  17. counter,
  18. cart,
  19. },
  20. //配置中间件
  21. middleware:
  22. (getDefaultMiddleware) => getDefaultMiddleware().concat(logger)
  23. })
  24. export default store;