如何提高redux开发效率?当然是redux-tookit啦!

前言

使用react-redux的朋友都经历过这种痛苦吧?

定义一个store仓库,首先创建各种文件,比如reducer、action、store...,然后 将redux和react连接使用。整个流程繁琐,写起来代码冗余。

react-redux创建仓库,文件目录如下:

好怀念使用 vuex创建写仓库的日子....... 直到有一天我发现了redux-toolkit ,原来redux还能这样写呀!

什么是redux-toolkit

redux-toolkit 是官方推荐的编写redux逻辑的方法,简化了redux的配置过程,无需再创建actions、reducer的,更大程度方便使用redux仓库

基本使用

redux-toolkit的使用步骤,可分为如下5步

  • 1、安装 redex-toolkit
  • 2、创建slices
  • 3、创建store
  • 4、将Redux连接到React应用(provide)
  • 5、在React组件中使用(useSelector、useDispath)

环境配置

vscode React Redux Toolkit RTK Quer 安装npm

tsx 复制代码
npm i redux react-redux @reactjs/toolkit

创建切片 slices

一个切片是一个包含 reducer 函数和 action creator 的对象。它定义了一部分状态和与该状态相关的操作。

jsx 复制代码
// sliceTbale.js

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

const moviesSlice = createSlice({
  name: 'movies',
  // c初始化状态
  initialState: {
    currentData:[],// 
    tableData:[]
  },  
  reducers: {
      delete_table: (state, { payload }) => { 
            // 通过筛选实现删除 
             state.currentTable = state.currentTable.filter((item:{id:any})=>{
                return item.id !== payload.id
             }) 
             state.table =  state.currentTable
             message.success('删除成功') 
        },
  },
});

export const { addMovie } = moviesSlice.actions; // 导出 action creator
export default moviesSlice.reducer; // 导出 reducer

创建仓库-store

我们使用 configureStore 函数来创建 Redux Store,并使用刚刚创建的 reducer 将切片与 Store 关联起来。

typescript 复制代码
// 创建store仓库
import { configureStore } from "@reduxjs/toolkit";
import  initTable  from "./module/table";

const reduxStore = configureStore({
    reducer: {
        // xxx: xxx,
        table:initTable
    },
})

export default reduxStore

redux链接react

完成以上步骤,redux配置ok啦,如何让整个项目中应用redux呢? 使用Provider包裹 React顶层组件,将 Redux store 对象传递给组件树中的所有组件,使得 Redux 的状态管理能够在整个应用程序中生效。 打开项目的入口文件 index.tsx,代码如下:

tsx 复制代码
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import RouterConfig from './router/routerConfig';
import RouterView from './router/routerView';
import "nprogress/nprogress.css" // 样式
import { Provider } from 'react-redux';
import reduxStore from './store';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <Provider store={reduxStore}> 
      <RouterView config={RouterConfig}></RouterView>
    </Provider>
  </React.StrictMode>
);

组件中使用redux

使用状态和操作:在组件中,可以使用 useSelector 和 useDispatch 钩子来访问状态和触发 action。

tsx 复制代码
import React, { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';

interface IndexProps {}

const Index: React.FC<IndexProps> =  (props) => {
  //  获取redux仓库数据
  const tableState = useSelector((state:any)=>state.table)
   // 创建redux 派发器
  const Dispath = useDispatch()
  console.log('table仓库数据',tableState)  
  return (
    <> 
      {tableState.currentData.length}
     </>
  );
};

export default Index;

进阶使用

redux中如何执行异步呢? createAsyncThunk 创建异步操作, 通常用于发出异步请求。 createAsyncThunk 创建一个异步action,方法触发的时候会有三种状态:

  • pending(进行中)
  • fulfilled(成功)
  • rejected(失败)
typescript 复制代码
export const getMovieData:any = createAsyncThunk('sliceTable/getMovie', 
  async () => {
    const res= await getMovieListApi();
    return res;
  }
);

完整示例

typescript 复制代码
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import { getMovieListApi } from "../../API/home";
 import { message } from "antd";
// // createAsyncThunk 创建异步操作, 通常用于发出异步请求。
// createAsyncThunk 创建一个异步action,方法触发的时候会有三种状态:
// pending(进行中)、fulfilled(成功)、rejected(失败)
export const getMovieData: any = createAsyncThunk('sliceTable/getMovie',
    async () => {
        const res = await getMovieListApi();
        return res;
    }
);

const sliceName = createSlice({
    name: "sliceTable",
    initialState: {
        table: [],
        currentTable: []
    },
    reducers: {
        initTable: (state, { payload }) => {
            // console.log('初始化sliceTable数据')
        },
        delete_table: (state, { payload }) => { 
            // 通过筛选实现删除 
             state.currentTable = state.currentTable.filter((item:{id:any})=>{
                return item.id !== payload.id
             }) 
             state.table =  state.currentTable
             message.success('删除成功') 
        },
        serach_table: (state, { payload }) => { 
            // 通过筛选实现删除 
            console.log('payload',payload)
             state.currentTable = state.table.filter((item:{name:string})=>{
                return item.name.includes(payload)
             })  
        },
        
    },
    // 让 slice 处理在别处定义的 actions, // 包括由 createAsyncThunk 或其他slice生成的actions
    extraReducers: builder => builder
        .addCase(getMovieData.pending, (state, { payload }) => {
            // state.loading = true
            console.log('异步请求 中')
        })
        .addCase(getMovieData.fulfilled, (state, { payload }) => {
            // state.loading = false
            console.log('拿到异步数据')
            state.table = payload.data.data.list
            state.currentTable = payload.data.data.list
        })
        .addCase(getMovieData.rejected, (state, { payload }) => {
            // state.loading = false
            // state.error = payload
            console.log('异步操作错误')
    
        })

})


export const { initTable,delete_table ,serach_table} = sliceName.actions
export default sliceName.reducer

extraReducers // extraReducers 字段让 slice 处理在别处定义的 actions, // 包括由 createAsyncg 或其他slice生成的actions。

store 映射到组件props中

使用 connect 函数将 store 内的数据映射到组件 props内

读者朋友好呀,我是王天~

尝试做过很多事情,汽修专业肄业生,半路出道的野生程序员、前端讲师、新手作者,最终还是喜欢写代码、乐于用文字记录热衷分享~

如文章有错误或者不严谨的地方,期待给于指正,万分感谢。

如果喜欢或者 有所启发,欢迎 star,对作者也是一种鼓励。

微信:「wangtian3111」,加我进王天唯一的读者群。

个人博客:itwangtian.com

相关推荐
傻小胖34 分钟前
React 脚手架使用指南
前端·react.js·前端框架
若川2 小时前
Taro 源码揭秘:10. Taro 到底是怎样转换成小程序文件的?
前端·javascript·react.js
真的很上进11 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
wakangda1 天前
React Native 集成原生Android功能
javascript·react native·react.js
秃头女孩y1 天前
【React中最优雅的异步请求】
javascript·vue.js·react.js
前端小小王1 天前
React Hooks
前端·javascript·react.js
迷途小码农零零发1 天前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
不是鱼2 天前
构建React基础及理解与Vue的区别
前端·vue.js·react.js
飞翔的渴望2 天前
antd3升级antd5总结
前端·react.js·ant design
爱喝奶茶的企鹅2 天前
Next.js 14 路由进阶:从约定式到动态路由的最佳实践
react.js