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

这篇具有很好参考价值的文章主要介绍了如何提高redux开发效率?当然是redux-tookit啦!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

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

react-redux创建仓库,文件目录如下:
如何提高redux开发效率?当然是redux-tookit啦!

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

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

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

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

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

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

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

个人博客:https://itwangtian.com文章来源地址https://www.toymoban.com/news/detail-710509.html

到了这里,关于如何提高redux开发效率?当然是redux-tookit啦!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用ChatGPT提高开发效率(Andoid)

    我们问了10个问题,开发的、生活中有疑问的,ChartGPT都给了我们答案。这些答案怎么样,请往下看吧。 ChatGPT-1、写一个车牌号的正则表达式 ChatGPT-2、写一个中国大陆车牌号的正则表达式 ChatGPT-3、用kotlin写一个车牌号的校验函数 ChatGPT-4、用Kotlin写一个String装换成金额的扩展

    2024年02月01日
    浏览(58)
  • 如何提高sql执行效率

    1.尽量避免全表扫描,首先应考虑在where及order by涉及到的列上建立索引 2.尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id

    2024年01月23日
    浏览(39)
  • 如何利用chatgpt提高工作效率?

    使用 ChatGPT 提高工作效率的关键在于有效利用其能力来辅助和优化你的工作流程。以下是一些具体的建议: 1. 自动化和优化常规任务 生成和编辑文本 :利用 ChatGPT 快速撰写或编辑报告、电子邮件、提案等。 代码辅助 :获取编程语言的帮助,包括代码示例、错误调试建议等

    2024年01月19日
    浏览(68)
  • 如何借助AIGC提高研究效率

    首先,如果是常规方法,没法使用ChatGPT,也没法使用ERNIE Bot: 还在排队中。 ChatGPT 4.0版本在网上看了很多介绍和测评,比较新的资讯是已经超过九成人类。 机器人/人工智能/就业形势2023_zhangrelay的博客-CSDN博客 如上这篇,引用了一张表格: 保守一点,ChatGPT4智商应该达到1

    2024年02月10日
    浏览(48)
  • 提高iOS App开发效率的方法

    随着智能手机的普及,iOS App开发成为越来越受欢迎的技术领域之一。许多人选择开发iOS应用程序来满足市场需求,但是iOS App开发需要掌握一些关键技术和工具,以提高开发效率和质量。本文将介绍一些关键点,可以帮助你进行高效的iOS App开发。 选择正确的开发工具 Xcode是一

    2024年01月22日
    浏览(35)
  • 前端开发提高效率的两大工具

    在浏览器中按下 F12 或者 鼠标右键点击检查 1、 元素 点击标红的图标可以用于在页面选择元素,同时右侧会找到元素在前端代码中的位置 点击下方红框可以看见页面在移动端中的页面展示  双击要修改的地方,可以进行编辑 ;修改后回车即可修改成功,可以看到左侧页面也

    2024年01月25日
    浏览(34)
  • 几款提高开发效率的Idea 插件

    开发代码过程中经常会有一些需要提交到代码仓库的文件,比如java文件生成的.class、.jar 等,如果将编译后的文件都提交到代码库那么代码库会很大,关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到代码仓库的问题。 提供Spring环境下的

    2024年01月16日
    浏览(57)
  • 区块链溯源:如何提高食品溯源效率

    食品溯源是指从消费者购买的食品追溯到其生产、加工、销售等各个环节的过程。食品溯源对于保障食品安全和质量非常重要,因为它可以帮助我们快速找出潜在的食品安全事件的原因,从而采取相应的措施。 然而,传统的食品溯源方法存在许多问题。首先,数据收集和存储

    2024年04月14日
    浏览(52)
  • 06 - Stream如何提高遍历集合效率?

    前面我们讲过 List 集合类,那我想你一定也知道集合的顶端接口 Collection。 在 Java8 中,Collection 新增了两个流方法,分别是 Stream() 和 parallelStream()。 现在很多大数据量系统中都存在分表分库的情况。 例如,电商系统中的订单表,常常使用用户 ID 的 Hash 值来实现分表分库,这

    2024年02月13日
    浏览(36)
  • 医生如何使用ChatGPT提高工作效率

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:

    2024年02月11日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包