Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何提高redux开发效率?当然是redux-tookit啦!

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

作者头像
程序员王天
发布于 2023-10-18 11:18:59
发布于 2023-10-18 11:18:59
39900
代码可运行
举报
运行总次数:0
代码可运行

# 前言

使用 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i redux react-redux @reactjs/toolkit

# 创建切片 slices

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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 关联起来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 创建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,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(失败)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export const getMovieData: any = createAsyncThunk(
  "sliceTable/getMovie",
  async () => {
    const res = await getMovieListApi();
    return res;
  }
);

# 完整示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { PureComponent } from "react";
import { connect } from "react-redux";
import { addNamesAction } from "./store/features/names";
export class Profile extends PureComponent {
  addNames(nameValue) {
    // console.log(nameValue)
    this.props.addNamesHandler(nameValue);
  }
  render() {
    const { names } = this.props;
    return (
      <div>
        <h2>Profile names: {names}</h2>
        <button onClick={(e) => this.addNames(", lzumiShinichi")}>
          addNames
        </button>
        <button onClick={(e) => this.addNames(", 大吉")}>addNames</button>
        <button onClick={(e) => this.addNames(", OkabeRintaro")}>
          addNames
        </button>
      </div>
    );
  }
}
const mapStateToProps = (state) => {
  return {
    names: state.names.names,
  };
};
const mapDispatchToProps = (dispatch) => ({
  addNamesHandler(namesValue) {
    dispatch(addNamesAction(namesValue));
  },
});
export default connect(mapStateToProps, mapDispatchToProps)(Profile);

参考 https://www.cnblogs.com/chccee/p/17145403.htmlopen in new window https://juejin.cn/post/7101688098781659172?searchId=20230919111823C8EB8D22FECCCE8115FC#heading-9open in new window https://juejin.cn/post/7105000617596157983?searchId=20230919111823C8EB8D22FECCCE8115FC#heading-21open in new window

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年9月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React/ReactNative 状态管理: redux-toolkit 如何使用
有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几篇文章我们来对比下 React 及 ReactNative 状态管理常用的几种框架的使用和优缺点。
张拭心 shixinzhang
2023/03/27
2K0
redux 文档到底说了什么(下)
上一篇文章主要介绍了 redux 文档里所用到的基本优化方案,但是很多都是手工实现的,不够自动化。这篇文章主要讲的是怎么用 redux-toolkit 组织 redux 代码。
写代码的海怪
2022/03/29
8650
vscode 插件合集
提供了一组代码片段和快捷方式,用于快速开发 React、Redux 和 React Native 应用。可以快速导入 React、Redux 相关的模块,自动生成组件的 PropTypes 类型检查等等。这些功能可以节省你在编辑器中的时间和精力,帮助你更专注于实际的开发任务。
程序员王天
2023/10/18
3420
vscode 插件合集
用 Redux 做状态管理,真的很简单🦆!
作为一名前端工程师,不少小伙伴对于 Redux 的概念、使用可能还是比较模糊,上手使用的心智负担也比较重!
小东同学
2022/07/29
3.7K0
用 Redux 做状态管理,真的很简单🦆!
我是这样在 React 中实践 TDD 编程的
在Redux中编写测试听起来肯定有悖直觉。如果你使用了Redux,它可能看起来更加复杂。
前端修罗场
2022/07/29
2.4K0
使用 Redux 工具包简化状态管理
在不断变化的前端开发领域中,有效的状态管理对于构建强大的应用程序至关重要。在没有适当工具的情况下处理状态可能会导致复杂且容易出错的代码。于是出现了 Redux Toolkit,这是一个简化和优化 Redux 应用程序状态管理的库。在本文中,我们将探讨 Redux Toolkit 的基础知识以及它如何增强开发者体验。
zayyo
2024/01/27
2940
Redux Toolkit
使用 React 和 Redux 启动新应用程序的推荐方法是使用官方 Redux+JS 模板或Redux+TS 模板来创建 React App,它利用了Redux Toolkit和 React Redux 与 React 组件的集成。
世间万物皆对象
2024/03/20
2570
Redux Toolkit:简化Redux应用状态管理
Redux Toolkit 是官方推荐用来简化Redux开发的工具集。它包含了一些预设的最佳实践,使得创建和管理Redux状态变得更简单。
天涯学馆
2024/08/16
3250
如何在 React 应用中使用 Hooks、Redux 等管理状态
大家好,我是若川。持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建有江西|湖南|湖北籍前端群,可加我微信进群。
若川
2022/11/11
9K0
如何在 React 应用中使用 Hooks、Redux 等管理状态
React/ReactNative 状态管理: rematch 如何使用
有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几篇文章我们来对比下 React 及 ReactNative 状态管理常用的几种框架的使用和优缺点。
张拭心 shixinzhang
2023/03/27
1.3K0
React/ReactNative 状态管理: rematch 如何使用
React Js 中创建和使用 Redux Store
本文,我们将学习在 React 应用中怎么创建 Redux Store。同时,我们将分享怎么使用 Redux store 去管理复杂的 states。
Jimmy_is_jimmy
2023/08/11
6120
React Js 中创建和使用 Redux Store
React/ReactNative 状态管理终于懂了!redux redux-toolkit 与 rematch 对比总结
有同学反馈开发 ReactNative 应用时状态管理不是很明白,这个问题我之前刚接触 React 时也遇到过,看了好多文章和视频才终于明白,不得不说,React 及三方库这方面做的有点过于复杂了!
张拭心 shixinzhang
2023/03/27
2.5K0
React/ReactNative 状态管理终于懂了!redux redux-toolkit 与 rematch 对比总结
聊聊两个状态管理库 Redux & Recoil
React 是一个十分优秀的UI库, 最初的时候, React 只专注于UI层, 对全局状态管理并没有很好的解决方案, 也因此催生出类似Redux 这样优秀的状态管理工库。
皮小蛋
2020/08/25
3.7K0
聊聊两个状态管理库 Redux & Recoil
【Redux】:Redux 指北
Redux 是JavaScript 应用的状态管理容器,提供集中式、可预测的状态管理。
WEBJ2EE
2021/06/15
1.7K0
redux 文档到底说了什么(上)
虽然文档写得不怎么样,但是里面确实给了很多比较好的代码组织方式,推荐了很多很有用的工具和插件,也慢慢地理解为什么这么简单的一个状态中心可以搞出这么多概念和库。
写代码的海怪
2022/03/29
2.1K0
redux 文档到底说了什么(上)
hook+react-redux让redux使用更简单
实际上,在react-redux中我们只需要了解这三个概念即可使用redux,而实际上这些也不难理解。我们只要掌握一些关键的api,尤其是hook,就可以很轻松地在我们的项目中加入redux
源心锁
2022/08/12
8930
hook+react-redux让redux使用更简单
学习react-redux,看这篇文章就够啦!
在 Redux 中,reducer 函数是用来处理状态(state)的函数。它接收两个参数:当前的状态(state)和被分发的 action,然后根据 action 的类型来更新状态并返回新的状态对象。
程序员王天
2023/10/18
6910
Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强
Redux 是 JavaScript 状态容器,提供可预测化的状态管理。它可以用在 react、angular、vue 等项目中, 但与 react 配合使用更加方便一些。
葡萄城控件
2023/01/13
1.8K0
Redux与前端表格施展“组合拳”,实现大屏展示应用的交互增强
Mobx与Redux的异同
Mobx与Redux都是用来管理JavaScript应用的状态的解决方案,用以提供在某个地方保存状态、修改状态和更新状态,使我们的应用在状态与组件上解耦,我们可以从一个地方获得状态,在另一个地方修改,在其他地方得到他们更新后的状态。他们都遵循单一数据源的原则,这让我们更容易推断状态的值和状态的修改。当然他们并不一定要跟React绑定在一起,它们也可以在AngularJs和VueJs这些框架库里使用。
WindRunnerMax
2022/05/10
1K0
通过五个真实应用场景,深入理解如何使用 TypeScript 枚举(enum)
枚举的一个常见用例是:在有限的选项集合中进行选择,使代码更清晰明了。下面我们来看看一个简单的例子,通过枚举来处理方向操作。
前端达人
2024/06/26
7460
通过五个真实应用场景,深入理解如何使用 TypeScript 枚举(enum)
相关推荐
React/ReactNative 状态管理: redux-toolkit 如何使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验