Redux详解(二)

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.actionsexport 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.liststate.recommends = payload.data.recommend.list},[fetchHomeMultidataActions.rejected](state, action) {console.log("rejected");}}
})export const { changeCategory }  = categorySlice.actionsexport 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到reduxthis.props.fetchHomeMultidata()}changeCategoryName(name) {this.props.changeCategory(name)}render() {const { userInfo, category, banners, recommends }  = this.propsreturn (<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.hqwc.cn/news/138851.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小样本学习--(1)概论

目录 一、概述 二、小样本学习的数据集 1、Omniglot 2、MiniimageNet 三、孪生网络 四、三元组损失函数 一、概述 小样本学习用于处理训练数据集中样本数量少的情况&#xff0c;一般来说&#xff0c;小样本学习流程是这样的&#xff0c;从一个多种类少量样本的巨大数据集…

微信小程序开发之会议oa(首页搭建)

前言&#xff1a; 上一篇我们掌握了关于小程序的框架&#xff0c;这篇博客带你完成小程序版的会议OA首页。效果如下&#xff1a; 一&#xff0c; 1.1先创建OA首页页面&#xff1a; 首先我们先建一个新项目&#xff0c;在app.json中编写代码 {"pages": ["pages/…

Tang Capital宣布收购纳斯达克上市公司Rain Oncology100%股权

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;纳斯达克上市公司Rain Oncology(Rain)宣布近期已收到Tang Capital Partners旗下的子公司Concentra Biosciences以每股1.25美元的现金收购要约。 这家临床阶段微型市值癌症治疗药物开发商的股价在消…

初识Java 14-1 测试

目录 测试 单元测试 JUnit 测试覆盖率 前置条件 断言 Java提供的断言语法 Guava提供的更方便的断言 契约式设计中的断言 DbC 单元测试 Guava中的前置条件 本笔记参考自&#xff1a; 《On Java 中文版》 测试 ||| 如果没有经过测试&#xff0c;代码就不可能正常工作…

C++数据结构X篇_16_二叉树的拷贝和释放(采用递归的方法)

在上篇的基础上&#xff0c;本篇介绍如何进行二叉树的拷贝和释放。从代码中可以看到采用递归方式进行的拷贝、释放操作&#xff0c;基本套路都是一样的。 文章目录 1. 二叉树的拷贝2. 二叉树的释放 1. 二叉树的拷贝 #include <iostream> using namespace std;//定义二叉…

RTOS(4)自己的第一个FreeRTOS程序

创建两个任务 什么是任务呢&#xff1f; 对于整个单片机程序&#xff0c;我们称之为application&#xff0c;应用程序。 使用FreeRTOS时&#xff0c;我们可以在application中创建多个任务(task)&#xff0c;有些文档把任务也称为线程 (thread)。 void Task1Function(void *p…

Druid连接池最小连接数设置失效问题

问题发现&#xff1a; 配置 当项目启动后 线程池确实是初始化了5条连接&#xff0c;但是当项目运行一段时间后&#xff0c;5条连接确消失了&#xff0c;只会程序用到得时候&#xff0c;再去初始化连接&#xff0c;这样有点违背了参数设置得意义&#xff0c;后来通过查阅资料发…

如何通过Photoshop将视频转换成GIF图片

一、应用场景 1、将视频转有趣动图发朋友圈 2、写CSDN无法上传视频&#xff0c;而可以用GIF动图替代 3、其他 二、实现步骤 1、打开Photoshop APP 2、点击文件——导入——视频帧到图层 3、选择视频文件 4、配置视频信息&#xff0c;按照图片提示配置完毕之后点击确定&…

C++对象模型(13)-- 构造函数语义学:析构函数

1、默认析构函数生成规则 跟构造函数一样&#xff0c;编译器不一定会为类生成默认析构函数。生成默认析构函数的规则有下面2条&#xff1a; &#xff08;1&#xff09;包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认析构函数。 &#xff08;2&#xff09;其…

14. Java多线程基础

Java —— 多线程 1. 线程与进程1.1 线程生命周期1.2 线程优先级 2. 多线程2.1 守护线程2.2 多线程高并发2.3 synchronized同步锁2.4 synchronized互斥锁 1. 线程与进程 进程&#xff08;Process&#xff09; 操作系统进行资源分配和调度的基本单位&#xff1a;系统中正在运行的…

【网络协议】聊聊从物理层到MAC层 ARP 交换机

物理层 物理层其实就是电脑、交换器、路由器、光纤等。组成一个局域网的方式可以使用集线器。可以将多台电脑连接起来&#xff0c;然后进行将数据转发给别的端口。 数据链路层 Hub其实就是广播模式&#xff0c;如果A电脑发出一个包&#xff0c;B、C电脑也可以收到。那么数据…

[uni-app] canvas绘制圆环进度条

文章目录 需求参考链接基本问题的处理1:画布旋转的问题2:注意arc()的起始位置是3点钟方向3: 如果绘制1.9*Matn.PI的圆环, 要保证其实位置在0点方向?4:小线段怎么画, 角度怎么处理? 源码 需求 要绘制一个如此的进度条 参考链接 uni-app使用canvas绘制时间刻度以及不显示问…