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

如何,提高,redux,开发,效率,当然,tookit · 浏览次数 : 18

小编点评

**1. 创建 store仓库** ```javascript import { configureStore } from "@reduxjs/toolkit"; import initTable from "./module/table"; const reduxStore = configureStore({ reducer: { // xxx: xxx, table: initTable, }, }); export default reduxStore; ``` **2. 将 Redux 和 React 连接** ```javascript 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( ); ``` **3. 在 React 组件中使用 Redux** ```javascript 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 ( // 渲染组件中显示的逻辑 ); }; ``` **4. ExtraReducers** ```javascript const sliceName = createSlice({ name: "sliceTable", initialState: { table: [], currentTable: [], }, reducers: { initTable: (state, { payload }) => { // console.log('初始化sliceTable数据') }, delete_table: (state, { payload }) => { // 通过筛选实现删除 }, search_table: (state, { payload }) => { // 通过筛选实现删除 }, }, extraReducers: builder => { builder.addCase(getMovieData.pending, (state, { payload }) => { // state.loading = true console.log('异步请求中') }) .addCase(getMovieData.fulfilled, (state, { payload }) => { // state.loading = false console.log('拿到异步数据') }) .addCase(getMovieData.rejected, (state, { payload }) => { // state.loading = false // state.error = payload console.log('异步操作错误') }) } }) const { initTable, delete_table, search_table } = sliceName.actions export const { initTable, delete_table, search_table } = sliceName.actions ```

正文

前言

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

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

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

好怀念使用 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

npm i redux react-redux @reactjs/toolkit

创建切片 slices

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

// 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 关联起来。

// 创建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,代码如下:

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。

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(失败)
export const getMovieData:any = createAsyncThunk('sliceTable/getMovie', 
  async () => {
    const res= await getMovieListApi();
    return res;
  }
);

完整示例

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内

image-20231007232652559

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

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

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

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

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

个人博客:https://itwangtian.com

与如何提高redux开发效率?当然是redux-tookit啦!相似的内容:

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

前言 使用react-redux的朋友都经历过这种痛苦吧? 定义一个store仓库,首先创建各种文件,比如reducer、action、store...,然后 将redux和react连接使用。整个流程繁琐,写起来代码冗余。 react-redux创建仓库,文件目录如下: 好怀念使用 vuex创建写

[转帖]如何提高Linux下块设备IO的整体性能?

http://www.yunweipai.com/6989.html 运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维 作者介绍 邹立巍 Li

如何提高量化策略回测的效率

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 我们在进行量化策略回测的时候,免不了要做一些时间序列的操作,比如计算过去一段时间的某个技术指标、因子等等,即时是横截面的策略,也需要在横截面数据准备后,进行时间序列的回测,用以确定因子在回测周期内的表现。

【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践

日志在 IT 行业中被广泛使用,日志的异常检测对于识别系统的运行状态至关重要。解决这一问题的传统方法需要复杂的基于规则的有监督方法和大量的人工时间成本。我们提出了一种基于自然语言处理技术运维日志异常检测模型。

云原生引擎单元测试实践

快速迭代的开发工作中如何提高代码质量一直是团队痛点,特别是没有测试支持的开发团队。合理的使用单元测试,并关注单元测试通过率、代码覆盖率可以有效提高代码质量。今天就来讲讲云原生引擎单元测试实践。

机器学习策略篇:详解如何改善你的模型的表现(Improving your model performance)

如何改善模型的表现 学过正交化,如何设立开发集和测试集,用人类水平错误率来估计贝叶斯错误率以及如何估计可避免偏差和方差。现在把它们全部组合起来写成一套指导方针,如何提高学习算法性能的指导方针。 所以想要让一个监督学习算法达到实用,基本上希望或者假设可以完成两件事情。首先,的算法对训练集的拟合很好,这

深入解析HTTP请求:了解请求特征与报文格式的关键秘密

这篇文章将带您深入了解HTTP请求的特征和报文格式。HTTP作为一种简单、灵活且易于扩展的协议,适用于各种操作系统和设备。我们还将探讨持久性连接如何提高请求的效率。了解HTTP报文的构成,包括起始行、头部字段和消息正文,将帮助您更好地理解HTTP的工作原理。无论您是初学者还是已经有一定了解的读者,本...

使用第一性原理思维思考如何打造提高生产力的平台

数字化转型会带来大量的研发需求,如何更好更快的交付这些需求成为一个突出问题,该怎么打造一个平台去解决该问题?能不能用第一性原理思维去推导出发展方向?

万字长文详解如何使用Swift提高代码质量

京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发。之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务。通过使用Swift提高了团队内同学的开发效率,同时也带来了质量的提升,目前来自Swift的Crash的占比不到1%。在这过程中不断的学习/实践,团队内的Code Review,也对如何使用Swift来提高代码质量有更深的理解。

App如何利用推送消息有效实现拉新促活?

对于大多数App来说,如何快速建立与用户的联系、提高用户活跃度、提升用户转化率,是产品运营过程中十分关心的问题,在常见的运营手段中,Push推送消息以其高性价比成为首选策略。但在实际运营过程中,推送消息的打开率和转化率远远达不到预期,App日活难以提升。那么如何才能有效提高打开和转化率,快速实现Ap