Redux详解(二)

news2024/12/22 19:23:27

1. 认识Redux Toolkit

Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。
通过传统的redux编写逻辑方式,会造成文件分离过多,逻辑抽离过于繁琐(具体可看上篇文章 Redux详解一),React官方为解决这一问题,推荐使用Redux Toolkit第三方包将redux逻辑聚合到一个文件中实现,解决上面的问题, Redux Toolkit 也成为 “RTK”。
npm install @reduxjs/toolkit
Redux Toolkit的核心API主要是如下几个:
  • configureStore: 包装createStore以提供简化的配置选项和良好的默认值。它可以自动组合你的 slice reducer,添加你提供的任何 Redux 中间件,redux-thunk默认包含,并启用 Redux DevTools Extension。
  • createSlice:  接受 reducer 函数的对象、切片名称和初始状态值,并自动生成切片 reducer ,并带有相应的 actions
  • createAsyncThunk: 
    接受一个动作类型字符串和一个返回承诺的函数,并生成一个pending/fulfilled/rejected基于该承诺分派动作类型的 thunk,相当于对异步操作的reducer处理,例如网络请求。

2. createSlice的使用

createSlice 主要包含如下几个参数:
  • name:用户标记slice的名词;
  • initialState :初始化;
  • reducers :相当于之前的reducer函数;
    const categorySlice = createSlice({
      name: "category",
      initialState: {
        category: "hello world",
        banners: [],
        recommends: []
      },
      reducers: {
        changeCategory(state, action) {
          state.category = action.payload
        }
      }
    })
    
    export const { changeCategory }  = categorySlice.actions
    
    export default categorySlice.reducer

3. store的创建

configureStore 用于创建store对象,常见参数如下:
  • reducer,将slice中的reducer可以组成一个对象传入此处;
  • middleware :可以使用参数,传入其他的中间件;
  • devTools :是否配置devTools工具,默认为true;
import { configureStore } from "@reduxjs/toolkit"

import counterReducer from './features/counter'
import homeReducer from './features/home'
import userInfoReducer from './features/userInfo'
import categoryReducer from './features/category/category'


// react-toolkit工具包使用方式
const store = configureStore({
  reducer: {
    counter: counterReducer,
    home: homeReducer,
    userInfo: userInfoReducer,
    category: categoryReducer
  }
})

export default store

4. Redux Toolkit的异步操作

以往对于redux中的异步操作,通过redux-thunk中间件让dispatch中可以进行异步操作。

Redux Toolkit默认已经给我们继承了Thunk相关的功能:createAsyncThunk
例如:
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"
import axios from "axios"

export const fetchHomeMultidataActions = createAsyncThunk("fetch/homeMultidata", async () => {
  const res = await axios.get('http://123.207.32.32:8000/home/multidata')

  return res.data
})
当createAsyncThunk创建出来的action被dispatch时,会存在三种状态:
  • pendingaction被发出,但是还没有最终的结果;
  • fulfilled :获取到最终的结果(有返回值的结果);
  • rejected :执行过程中有错误或者抛出了异常;

类似于promise, 参考promise的执行状态

Redux Toolkit在createSlice中通过extraReducer参数可以监听这些状态的过程:

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"
import axios from "axios"

export const fetchHomeMultidataActions = createAsyncThunk("fetch/homeMultidata", async () => {
  const res = await axios.get('http://123.207.32.32:8000/home/multidata')

  return res.data
})

const categorySlice = createSlice({
  name: "category",
  initialState: {
    category: "hello world",
    banners: [],
    recommends: []
  },
  reducers: {
    changeCategory(state, action) {
      state.category = action.payload
    }
  },
  extraReducers: {
    [fetchHomeMultidataActions.pending](state, action) {
      console.log("pending");
    },
    [fetchHomeMultidataActions.fulfilled](state, {payload}) {
      state.banners = payload.data.banner.list
      state.recommends = payload.data.recommend.list
    },
    [fetchHomeMultidataActions.rejected](state, action) {
      console.log("rejected");
    }
  }
})

export const { changeCategory }  = categorySlice.actions

export default categorySlice.reducer
extraReducer还有另外一种写法:链式调用

5. redux Toolkit在react的运用

通过Redux Toolkit创建store,对于store的数据使用,与传统的store数据获取方式一样,Redux Toolkit只是在store的初始化与逻辑编写进行了封装。

category.jsx

import React, { PureComponent } from 'react'
// import { fetchHomeMultidataActions} from '../../store/features/home'
import { changeCategory, fetchHomeMultidataActions } from '../../store/features/category/category'
import { connect } from 'react-redux'

export class Category extends PureComponent {

  componentDidMount() {
    // 抽离axios到redux
    this.props.fetchHomeMultidata()
  }

  changeCategoryName(name) {
    this.props.changeCategory(name)
  }

  render() {
    const { userInfo, category, banners, recommends }  = this.props
    return (
      <div>
        Category:
        <h2>userInfo: name: {userInfo.name}  age: {userInfo.age}</h2>
        <h2>category: name: {category}</h2>
        <button onClick={ e => this.changeCategoryName('你好 世界')}>修改</button>
        <div>
          <h2>banners数据:</h2>
          <ul>
            {
              banners.map((item, index) => {
                return <li key={index}>{item.title}</li>
              })
            }
          </ul>
        </div>
        <div>
          <h2>recommends数据:</h2>
          <ul>
            {
              recommends.map((item, index) => {
                return <li key={index}>{item.title}</li>
              })
            }
          </ul>
        </div>
      </div>
    )
  }
}

const mapStateToProps = (state) => ({
  userInfo: state.userInfo.userInfo,
  category: state.category.category,
  banners: state.category.banners,
  recommends: state.category.recommends
})

const mapDispatchToProps = (dispatch) => ({
  // changeBanners(banners) {
  //   dispatch(changeBannersActions(banners))
  // },
  // changeRecommends(recommends) {
  //   dispatch(changeRecommendsActions(recommends))
  // }
  fetchHomeMultidata() {
    dispatch(fetchHomeMultidataActions())
  },
  changeCategory(name) {
    dispatch(changeCategory(name))
  }
})

export default connect(mapStateToProps, mapDispatchToProps)(Category)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】单例模式、“多例模式”的实现以及对单例的一些思考

文章目录 1.概述2.单例模式实现代码2.1.饿汉式单例2.2.懒汉式单例2.3.双检锁单例2.4.静态内部类单例2.5.枚举单例 3.对单例的一些思考3.1.是否需要严格的禁止单例被破坏&#xff1f;3.2.懒汉式真的比饿汉式更佳吗&#xff1f;3.3.单例存在的问题 4.其他作用范围的单例模式4.1.线…

空调原理与结构、制冷剂类型及相关先进技术

一、空调相关知识 1. 空调定义 空调是指利用各种技术和设备对某一空间内空气的温度、湿度、洁净度和流速进行调节&#xff0c;以满足人们对舒适性要求或不同工艺环境要求。 2. 基本原理 蒸发吸热、冷凝放热 压力越低沸点越低 3. 空调主要结构 空调主要由压缩机、冷凝器、…

求臻医学:MRD的十八般武艺 AI双驱动流派

作为专注于肿瘤精准诊疗领域的国家高科技企业&#xff0c;求臻医学依托《中国肿瘤基因图谱计划》和《肿瘤精准医学大数据平台》项目&#xff0c;围绕肿瘤诊断监测、预后评估、肿瘤早筛、遗传筛查、药物研发服务等场景&#xff0c;开发了针对肺癌、结直肠癌、胃癌、前列腺癌等实…

【Qt高阶】Qt D-Bus 简介【2023.10.16】

Qt D-Bus介绍 简介总线技术名词消息&#xff08;阐述总线的消息内涵&#xff09;服务名对象路径接口备忘表(便于记住名字的格式)调试 麒麟V10 与D-Bus 简介 D-Bus 是一个进程间通信(IPC)和远程过程调用(RPC)机制,最初是为了 Linux 开发,用来取代现有的竞争的 IPC 解决方案,提供…

交通部 EDI是什么?如何处理?

交通部于1996年开始实施《国际集装箱运输电子信息传输和运作系统及示范工程》&#xff0c;即在中国远洋运输集团、上海口岸、宁波口岸、天津口岸和青岛口岸建立 EDI 示范工程。 交通部 EDI 的数据结构 电子口岸或者其他物流企业需要确保能够生成和解析符合交通部要求的EDI数据…

两个pdf合并成一个pdf?

两个pdf合并成一个pdf&#xff1f;pdf合并是我们在处理PDF中非常常见的一个操作。我们看似有很多方法能够实现这一操作&#xff0c;但是真正适合自己的方法确实能够帮助我们很多。那么多方法的话&#xff0c;小编今天打算汇总几个比较适合新手的快速方法&#xff0c;这样效率更…

建立线上线下一体化营销体系,数字化营销系统必不可少

​在当今的市场环境中&#xff0c;实体行业想要取得持续的收入增长&#xff0c;必须将线上线下业务相结合&#xff0c;充分利用数字化营销系统的功能&#xff0c;以构建“全链路式”数字化营销体系。 而数字化营销系统中&#xff0c;常见的如分销系统、拼团系统、分红系统、积分…

mission planner通过串口连接3DR数传,远程飞控

前提 pixhaw2.4.8已布线&#xff0c;有单独的电源供电&#xff0c;通过电量计接power接口 电量计的输入端接24V电源&#xff0c;飞控的输入是5v电源&#xff0c;电量计上有个模块可以分压将5v的电输入到飞控 数传接在接口telem 2上&#xff08;一个接飞控&#xff0c;一个接电…

用浏览器进行web应用测试,你会怎么做?

有没有遇到这样的一个场景&#xff1a;你在使用浏览器进行web应用测试&#xff0c;但是你想知道你在测试过程中的前端输出和后端响应的情况究竟如何。那么&#xff0c;你会怎么做呢&#xff1f;想必大多人会毫不犹豫地回答&#xff1a;通过浏览器console面板和network面板抓取信…

idea使用debug无法启动,使用run可以启动

1、将调试断点清除 使用快捷键ctrl shift F8&#xff0c;将勾选的选项去除即可 2、Error running SampleApplication: Command line is too long. Shorten command line for SampleApplication or also for Spring Boot default configuration&#xff0c;报这种错误&#x…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(五):有损传输线的特性阻抗和信号传输速度

有损传输线的特性阻抗 理想有损传输线特性阻抗是和频率相关的&#xff0c;很复杂。可以有以下公式&#xff1a; 按照代数知识&#xff0c;特性阻抗的实部和虚部如下&#xff1a; 其中RL表示单位长度导体的串联电阻 CL表示单位长度电容 LL单位长度串联环路电感 GL电介质单位长度…

番茄小说推文怎么申请授权?

以下为申请步骤 1.使用“巨量推文” 2.找到番茄小说这个小说app 3.按照要求申请关键词 完成以上步骤即可申请番茄小说推文关键词授权

前端新特性:Compute Pressure API!!!

前几天&#xff0c;review 同事代码的时候发现了一个新的 JS API PressureObserver。 通过一番搜索&#xff0c;发现这个 API 是 Compute Pressure API 的一部分。 Compute Pressure API&#xff1a;https://www.w3.org/TR/compute-pressure/ 它的作用是可以观察 CPU 的变…

yolov8如何进行训练验证推理

1、新建脚本main.py&#xff0c;也可以建一个yaml文件&#xff08;避免改到default.yaml&#xff09;&#xff0c;这个yaml文件是在训练时用到 batchsize什么的都可以在yaml文件改&#xff0c;这俩东西不用填 2、两种训练的方法&#xff0c;用的时候可以注释掉其他 from u…

【无标题】三分钟快速实现MQTT网关远程连接三菱系列PLC

MQTT协议网关串口连接三菱FX3UPLC操作说明v1.2 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工作 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器准备工作 三. 腾讯云平台配置步骤 3.1 创建产品 3.2 添加设备 3.3 获取…

Python 中的变量Variable

六、Python 中的变量 1、变量的创建和赋值 在 Python 程序中,变量是用一个变量名表示,可以是任意数据类型,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,比如: a=88这里的 a 就是一个变量,代表一个整数,注意一点是 Python 是不用声明数据类型…

h5端自动滑动轮播效果实现

一、客户需要的效果图 二、具体代码实现如下&#xff1a; dom:<div class"swiper-container"> <div class"swiper-wrapper ul" click"setInputText"> <div class"swiper-slide li" v-for"(item, index) in answe…

如何使用内网穿透实现U8用友ERP本地部署并远程访问办公?

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless服务支持情况(四)

文档中的TS作者认为就是ArkTS之意。 一、云存储 AppGallery Connect&#xff08;简称AGC&#xff09;云存储是一种可伸缩、免维护的云端存储服务&#xff0c;可用于存储图片、音频、视频或其他由用户生成的内容。借助云存储服务&#xff0c;您可以无需关心存储服务器的开发、…

尾菜变宝、苹果富硒:青年学子秀农研成果 拼多多以赛促研助乡村振兴

青年兴则国兴&#xff0c;青年强则国强。一批新时代中国青年&#xff0c;仍保持着“自找苦吃”的精气神&#xff0c;冬天凿冰、夏天抗暑&#xff0c;以科技小院为依托&#xff0c;在服务三农建设中“解民生、治学问”。 10月14日&#xff0c;“中国研究生乡村振兴科技强农创新…