redux-saga 使用详解说明

2024-04-29 08:18
文章标签 使用 详解 说明 redux saga

本文主要是介绍redux-saga 使用详解说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

redux-saga 是一个用于管理应用程序 Side Effect(副作用,例如异步获取数据,访问浏览器缓存等)的 library,它的目标是让副作用管理更容易,执行更高效,测试更简单,在处理故障时更容易。

可以想像为,一个 saga 就像是应用程序中一个单独的线程,它独自负责处理副作用。 redux-saga 是一个 redux 中间件,意味着这个线程可以通过正常的 redux action 从主应用程序启动,暂停和取消,它能访问完整的 redux state,也可以 dispatch redux action。

redux-saga 使用了 ES6 的 Generator 功能,让异步的流程更易于读取,写入和测试。通过这样的方式,这些异步的流程看起来就像是标准同步的 Javascript 代码。有点像 async/await 功能。

那他跟我们以前使用 redux-thunk 有什么区别了,不再会遇到回调地狱了,你可以很容易地测试异步流程并保持你的 action 是干净的。

接下来我们详细的说明如何接入我们自己的项目。react 项目搭建我们这就不累赘,直接用 create-react-app 脚手架创建一个。这个网上很多教程,用起来也很简单,构建能力也很强,适合基本所有项目。后面代码标记加粗的部分是我们需要在脚手架基本上编辑的代码。

redux-saga 故名思议它是跟 redux 一起用的,是解决 react 状态管理副作用的一个中间件。下面我们以一些案例来学习这个中间件,开启我们的神奇之旅。

  • 安装 react-redux redux-saga
npm i -S react-redux redux-saga
  • src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';import { createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import { composeWithDevTools } from 'redux-devtools-extension'; // 与谷歌插件配合可以更直观的在浏览器上查看redux state 状态
import createSagaMiddleware from 'redux-saga';
import rootReducer from './reducers';
import mySaga from './sagas';const sagaMiddleware = createSagaMiddleware();
const store = createStore(rootReducer,composeWithDevTools(applyMiddleware(sagaMiddleware))
)
sagaMiddleware.run(mySaga)ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
  • 新建 sagas 目录 index.js
import { all } from 'redux-saga/effects';
import { add } from './counter';export default function* rootSaga() {yield all([add()])
}
  • sagas/counter.js
import { put, takeEvery, delay } from 'redux-saga/effects';function* increase() {yield delay(1000); // 等待1秒yield put({ type: 'INCREMENT' }); // 命令 middleware 向 Store 发起一个 action
}// 监听异步自增事件
export function* add() {yield takeEvery('INCREMENT_ASYNC', increase);
}
  • 新增reducers目录 index.js
import { combineReducers } from 'redux';
import counter from './counter';export default combineReducers({counter
})
  • reducers/counter.js
const counter = (state = 1, action = {}) => {switch(action.type) {case 'INCREMENT':return state + 1;default:return state;}
}export default counter;
  • 新建actions目录 index.js
// 自增
export const increate = () => {return {type: 'INCREMENT'}
}// 异步自增(等待1秒才触发自增action)
export const increateAsync = () => {return {type: 'INCREMENT_ASYNC'}
}
  • 自增组件
import React from 'react';
import { connect } from 'react-redux';
import { increate, increateAsync } from '../actions';class CustomCounter extends React.Component {render() {return (<div className="custom-counter" style={{padding: 50}}><div style={{ marginBottom: '20px' }}><p>{this.props.counter}</p><button onClick={()=>this.props.increate()}>自增</button><button onClick={()=>this.props.increateAsync()}>异步自增</button></div></div>)}
}const mapStateToProps = (state) => {return {counter: state.counter}
}export default connect(mapStateToProps, { increate, increateAsync })(CustomCounter);

这是一个相对简单的自增组件,利用到了 redux-saga。但是从代码不能看出他的 Generator 功能确实使代码看起来可读性要好一些。而且抽离一层出来,使得 redux 代码更加的清晰。下面我们来一个稍复杂一点的案例,异步请求接口获取用户信息。这里请求接口用到了 react 代理功能,react proxy 配置请参考:https://www.ifrontend.net/2021/07/react-proxy/

这里我们用到另个非常好用的 ajax 模块, axios,下面安装一下吧

npm i -S axios
  • 新建一个 fetchUser.js 获取用户信息的 saga
import { call, takeEvery, put } from 'redux-saga/effects';
import axios from 'axios';function* fetch_user() {try {const userInfo = yield call(axios.get, '/api/getUserInfo');yield put({ type: 'FETCH_SUCCESS', userInfo: userInfo.data });} catch (e) {yield put({ type: 'FETCH_FAIL', error: e });}
}function* user() {yield takeEvery('FETCH_REQUEST', fetch_user);
}const rootUser = [user()
]export default rootUser;
  • 新建一个 users.js reducer
const initialState = {isFetch: false,error: null,userInfo: null
}const user = (state = initialState, action = {}) => {switch (action.type) {case 'FETCH_REQUEST':return {...state,isFetch: true}case 'FETCH_SUCCESS':return {...state,isFetch: false,userInfo: action.userInfo}case 'FETCH_FAIL':return {...state,isFetch: false,error: action.error}  default:return state;}
}export default user;
  • 新建一个 users.js action
export const fetchUser = () => {return {type: 'FETCH_REQUEST'}
}
  • CustomUserInfo 组件
import React from 'react';
import { connect } from 'react-redux';
import { fetchUser } from '../actions/users.js';class CustomUser extends React.Component {render() {const { isFetch, error, userInfo } = this.props.user;let data = ''if (isFetch) {data = '正在加载中...'} else if (userInfo) {data = userInfo.name;} else if (error) {data = error.message;}return (<div className="custom-user" style={{padding: 50}}><div style={{ marginBottom: '20px' }}><button onClick={()=>this.props.fetchUser()}>axios请求</button ></div><h2>{data}</h2></div>)}
}const mapStateToProps = (state) => {return {user: state.user}
}export default connect(mapStateToProps, { fetchUser })(CustomUser);
  • 这里用到了一个 api/getUserInfo 的接口,笔者是采用 node.js koa 做的,这里也贴一下代码。
const koa = require('koa');
const app = new koa();
const Router = require('koa-router');
const router = new Router();router.get('/api/getUserInfo', async (ctx, next) => {ctx.body={state:"success",name: '伍哥的传说'};
})// 启动路由
app.use(router.routes()).use(router.allowedMethods())app.listen(3001, () => {console.log('server is running at http://localhost:3001')
});

经过这个是不是越来越觉得 redux-saga 好用了,答案是肯定的,用 redux-thunk 时有异步操作时,除了有可能会回调地狱,ajax 请求的业务逻辑也是跟 action 柔在一起的。代码没有这么清晰。

当然 redux-saga 就这些作用,功能吗。肯定不止这些,下面我们一一来尝试!

  • 监听未来的 action

日志记录器:Saga 将监听所有发起到 store 的 action,并将它们记录到控制台。
使用 takeEvery(‘*’)(使用通配符 * 模式),我们就能捕获发起的所有类型的 action。

import { select, takeEvery } from 'redux-saga/effects'function* watchAndLog() {yield takeEvery('*', function* logger(action) {const state = yield select()console.log('action', action)console.log('state after', state)})
}

待更新…

前端开发那点事

微信公众号搜索“前端开发那点事”

这篇关于redux-saga 使用详解说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/945566

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]