【React】Redux Toolkit的使用

Redux toolkit使用

  • [1. 背景](#1. 背景)
  • 2.文档
  • [3. 使用](#3. 使用)
    • [3.1 安装](#3.1 安装)
    • [3.2 创建入口文件 redux](#3.2 创建入口文件 redux)
    • [3.3 redux/index.js](#3.3 redux/index.js)
    • [3.4 redux/reducer.js](#3.4 redux/reducer.js)
    • [3.5 使用示例](#3.5 使用示例)

1. 背景

Redux Toolkit 出现的背景可以追溯到对 Redux 的使用和开发中出现的一些常见模式和问题。Redux 是一个非常强大的状态管理库,但在实际使用中,它可能涉及到一些繁琐的模板代码编写,比如定义 action 类型、编写 action 创建函数、编写 reducer 等等。同时,Redux 的设计哲学也是相对低级的,需要开发者对一些细节进行处理。

为了简化 Redux 的使用,提高开发效率,并且让 Redux 更易于理解和维护,Redux Toolkit 应运而生。Redux Toolkit 是 Redux 官方推荐的工具集,它旨在提供一组工具和最佳实践,帮助开发者更快速地编写 Redux 代码,并且在不牺牲灵活性的前提下提供更好的开发体验。

Redux Toolkit 的出现解决了几个问题:

  1. 简化 Redux 的使用:Redux Toolkit 提供了一组工具和函数,可以帮助开发者更轻松地定义 action、编写 reducer,并且提供了一种更简洁的方式来组织和管理状态。

  2. 减少样板代码:Redux Toolkit 使用了一些现代 JavaScript 的特性,比如 immer 库来处理不可变性,以及 createSlice 函数来自动生成 action 类型和 action 创建函数,从而减少了大量的样板代码。

  3. 默认集成 Redux DevTools Extension:Redux Toolkit 默认集成了 Redux DevTools Extension,使得开发者可以更方便地进行状态管理调试和监控。

  4. 提供更好的性能:Redux Toolkit 在内部做了一些优化,比如使用了 immer 库来实现不可变性,这使得 Redux Toolkit 在性能上有一些优势。

总的来说,Redux Toolkit 的出现是为了让 Redux 更易于上手、更高效、更灵活,从而提升开发者的开发体验和代码质量。

2.文档

英文文档:
https://redux-toolkit.js.org/introduction/getting-started

中文文档:
https://cn.react-redux.js.org/introduction/getting-started/

3. 使用

3.1 安装

bash 复制代码
# 如果你使用 npm:
npm i @reduxjs/toolkit

# 或者你使用 Yarn:
yarn add @reduxjs/toolkit

3.2 创建入口文件 redux

复制代码
- redux
 	- index.js
 	- reducer.js 

3.3 redux/index.js

js 复制代码
import { configureStore } from "@reduxjs/toolkit";
import { SetInitState } from "./reducer";

const store = configureStore({  
  reducer: {
    SetInitState,
  }
})

export default store;

3.4 redux/reducer.js

js 复制代码
import { createSlice } from '@reduxjs/toolkit';

// 初始状态
const initState = {
  count: 1
}

// 创建redux切片对象
export const setInitState = createSlice({
  name: "appState", // 切片名称 用来标识redux
  initialState: initState, // 需要管理的状态
  reducers: {  // 配置reducer 用以更新的状态
    countAdd (state) {
      state.count++;
    },
    setCount (state, action) {
      state.count = action.payload;
    }
  }
})

// 导出状态
export const { countAdd, setCount } = setInitState.actions;
// 导出reducer
export const SetInitState = setInitState.reducer;

3.5 使用示例

  1. 根目录index.js中使用Provider包裹根组件
js 复制代码
import React from 'react'
import ReactDOM from 'react-dom/client'
import { Provider } from 'react-redux'
import App from './App'
import { BrowserRouter } from 'react-router-dom'

const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
  <BrowserRouter>
    <Provider store={store}>
      <App />
    </Provider  >
  </BrowserRouter>
)

reportWebVitals()
  1. 子组件中使用

    import { useSelector } from 'react-redux'

    const App = () => {
    // 拿到redux定义的初始状态
    const { count } = useSelector((state) => state.SetInitState)

    return (

    {count}
    ) }
相关推荐
里欧跑得慢2 小时前
17. Flutter Hero动画实现:让界面过渡更加优雅
前端·css·flutter·web
IT_陈寒3 小时前
Vue的这个响应式陷阱,我debug了一整天才爬出来
前端·人工智能·后端
cn_mengbei3 小时前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
kyriewen3 小时前
前端测试:别为了100%覆盖率而写测试,那是自欺欺人
前端·javascript·单元测试
去伪存真3 小时前
我自己写的第一个skills--project-core-standards
前端·agent
Data_Journal3 小时前
如何使用cURL更改User Agent
大数据·服务器·前端·javascript·数据库
竹林8184 小时前
wagmi v2 多链钱包切换:一个 Uniswap 仿盘项目让我踩了三天坑
前端·javascript
donecoding4 小时前
Playwright MCP 页面捕获:Snapshot、截图、HTML 到底选哪个?
前端·ai编程·前端工程化
滕青山4 小时前
在线PDF拆分工具核心JS实现
前端·javascript·vue.js
Smilezyl4 小时前
一个独立开发者,靠一份 markdown 驱动 Claude Code, 用 20 天跑通 9 个包的 monorepo 工程
前端·人工智能·github