• Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理


    随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,但传统的Redux设置和使用过程比较繁琐。幸运的是,Redux官方团队推出了@reduxjs/toolkit,这个工具包极大简化了Redux在React项目中的使用.

    在这里插入图片描述

    传统Redux vs @reduxjs/toolkit

    传统Redux:

    • 需要手动编写action creators、action types和reducers
    • 需要手动配置中间件和开发者工具
    • 处理异步操作需要单独使用redux-thunk或redux-saga
    • 不可变状态更新需要手动使用深拷贝或Object.assign等
    • 需要手动编写选择器函数

    使用@reduxjs/toolkit:

    • 使用createSlice自动生成action creators和action types
    • 使用configureStore自动配置中间件和开发者工具
    • 内置createAsyncThunk处理异步操作
    • 内置immer.js,简化不可变状态更新
    • 提供createSelector创建选择器函数
    • 代码更加简洁,减少样板代码

    总的来说,@reduxjs/toolkit通过工具函数和opinionated的默认配置,极大简化了Redux的使用,提高了开发效率。它包装了许多常用功能,同时也保留了Redux可扩展的优势。

    使用@reduxjs/toolkit的最小示例

    一个使用@reduxjs/toolkit构建简单计数器的示例:

    1. 安装依赖
    npm install @reduxjs/toolkit react-redux
    
    • 1
    1. 创建 store

    新建 store.js 文件:

    import { configureStore } from '@reduxjs/toolkit';
    
    // 定义初始状态
    const initialState = {
      counter: 0
    }
    
    // 创建切片
    const counterSlice = createSlice({
      name: 'counter',
      initialState,
      reducers: {
        // 定义修改state的reducer
        increment(state) {
          state.counter++
        },
        decrement(state) {
          state.counter--
        }
      }
    })
    
    // 导出 reducer 和 actions
    export const { increment, decrement } = counterSlice.actions;
    export default counterSlice.reducer;
    
    // 配置store
    const store = configureStore({
      reducer: {
        counter: counterSlice.reducer
      }
    })
    
    export default store;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    1. 在React组件中使用
    import React from 'react';
    import { useSelector, useDispatch } from 'react-redux';
    import { increment, decrement } from './store';
    
    const Counter = () => {
      const count = useSelector(state => state.counter.counter);
      const dispatch = useDispatch();
    
      return (
        <div>
          <h1>{count}</h1>
          <button onClick={() => dispatch(decrement())}>-</button>
          <button onClick={() => dispatch(increment())}>+</button>
        </div>
      )
    }
    
    export default Counter;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1. 在入口文件中提供store
    import React from 'react';
    import { Provider } from 'react-redux';
    import store from './store';
    import Counter from './Counter';
    
    const App = () => (
      <Provider store={store}>
        <Counter />
      </Provider>
    )
    
    export default App;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    通过这个示例,你可以看到如何使用@reduxjs/toolkit创建store、切片(slice)和在React组件中使用Redux。主要步骤是:

    1. 使用configureStore创建store
    2. 使用createSlice创建切片,包括初始状态和reducer
    3. 在React组件使用useSelector获取状态,useDispatch分发action
    4. 通过Provider将store提供给整个应用

    这个示例实现了一个简单的计数器功能,帮助你入门@reduxjs/toolkit和Redux在React中的基本用法。可以看到@reduxjs/toolkit如何简化Redux在React中的使用。主要包括创建store、切片(slice)以及在React组件中分发action和获取状态。

    使用@reduxjs/toolkit的主要优势包括:减少样板代码、更简洁的语法、开箱即用的异步处理、不可变更新友好以及良好的开发者体验。无论你是Redux新手还是老手,都可以从使用@reduxjs/toolkit中获益。官方也强烈推荐在新项目中使用该工具包作为Redux的入口。

    ps:当然了,react中的状态管理方案除了redux、基于redux的@reduxjs/toolkit,还有很多其它方案,如MobX也是一个不错的选择,具体可参考:https://blog.csdn.net/sky6862/article/details/137650210

  • 相关阅读:
    React - 路由跳转方法
    【第6天】SQL快速入门-综合练习(SQL 小虚竹)
    写好 Spring Starter : 控制好Bean的加载顺序与原理
    [Python进阶] 程序打包之Pyinstaller参数介绍
    OpenSM-QoS管理
    llama2+localGPT打造纯私有知识助手
    抢滩“数字厨电”时代,老板电器用全新“数字人”冲阵
    Go 原生的 git 实现库:go-git
    库存管理“智慧官”上线!北京电信基于飞桨打造主动型库存决策分析系统
    Android U 匹配不到APN,无法发起数据建立的问题分析
  • 原文地址:https://blog.csdn.net/sky6862/article/details/138030810