React手稿之 React-Saga的详解


Posted in Javascript onNovember 12, 2018

Redux-Saga

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

redux-saga相当于一个放置在action与reducer中的垫片。

之所以称之谓副作用呢,就是为了不让触发一个action时,立即执行reducer。也就是在action与reducer之间做一个事情,比如异步获取数据等。

redux-saga使用了ES6中的Generator功能,避免了像redux-thunk的回调地狱。

如何使用

安装

$ npm install --save redux-saga
//或者
$ yarn add redux-saga

示例

假设有一个UI界面,是根据用户ID显示用户详情的。那么我们需要通过接口从数据库根据userId来获取数据。

简单起见,我们在本地使用一个json文件来模拟数据库数据。

{
 "297ee83e-4d15-4eb7-8106-e1e5e212933c": {
  "username": "Saga"
 }
}

创建UI Component

import React from 'react';
import { USER_FETCH_REQUESTED } from '../../../actions/User';

export default class extends React.Component {

 constructor(props) {
  super(props);
  this.state = { userId: '297ee83e-4d15-4eb7-8106-e1e5e212933c' }
 }

 render() {
  const { userInfo = {}, dispatch } = this.props;
  return (
   <React.Fragment>
    <button onClick={() => {
     dispatch({ type: USER_FETCH_REQUESTED, payload: { userId: this.state.userId } });
    }}>Get User Info</button> <span>用户名: {userInfo.username}</span>
   </React.Fragment>
  );
 }
}

创建saga,这里的saga就相当于action.

import { call, put, takeEvery } from 'redux-saga/effects'
import { fetchUserApi } from '../api/user';
import { USER_FETCH_REQUESTED, USER_FETCH_SUCCEEDED, USER_FETCH_FAILED } from '../actions/User';

function* fetchUser({ payload }) {
 try {
  const user = yield call(fetchUserApi, payload.userId);
  yield put({ type: USER_FETCH_SUCCEEDED, user });
 } catch (e) {
  yield put({ type: USER_FETCH_FAILED, message: e.message });
 }
}

const userSaga = function* () {
 yield takeEvery(USER_FETCH_REQUESTED, fetchUser);
}

export default userSaga;

关于fetchUserApi,我们会在后面的章节中描述。这里仅获取了json文件中与userId相对应的数据。

把saga放入store中:

import createSagaMiddleware from 'redux-saga';
import Sagas from '../sagas/index';

const sagaMiddleware = createSagaMiddleware()
const store = createStore(
 reducer,
 applyMiddleware(sagaMiddleware)
)
sagaMiddleware.run(Sagas)

最后再实现相就的reducer即可:

import { USER_FETCH_SUCCEEDED } from '../actions/User';

const initialState = { user: {} };

export default (state = initialState, action) => {
 switch (action.type) {
  case USER_FETCH_SUCCEEDED:
   return { ...state, user: action.user };
  default:
   return state;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
javascript一些不错的函数脚本代码
Sep 10 Javascript
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
jQuery匹配文档链接并添加class的方法
Jun 26 Javascript
jQuery检测返回值的数据类型
Jul 13 Javascript
laypage分页控件使用实例详解
May 19 Javascript
解析ajaxFileUpload 异步上传文件简单使用
Dec 30 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
详解JavaScript调用栈、尾递归和手动优化
Jun 03 Javascript
vue做移动端适配最佳解决方案(亲测有效)
Sep 04 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
Apr 29 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
基于游标的分页接口实现代码示例
Nov 12 #Javascript
React Hooks的深入理解与使用
Nov 12 #Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
Nov 12 #Javascript
jQuery 操作 HTML 元素和属性的方法
Nov 12 #jQuery
微信小程序左滑删除功能开发案例详解
Nov 12 #Javascript
微信运维交互机器人的示例代码
Nov 12 #Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 #jQuery
You might like
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
python将ip地址转换成整数的方法
2015/03/17 Python
python修改操作系统时间的方法
2015/05/18 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python 递归函数详解及实例
2016/12/27 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
django解决跨域请求的问题
2018/11/11 Python
python xpath获取页面注释的方法
2019/01/14 Python
Python 获取numpy.array索引值的实例
2019/12/06 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
python如何提升爬虫效率
2020/09/27 Python
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
申报职称专业技术个人的自我评价
2013/12/12 职场文书
班风学风建设方案
2014/05/06 职场文书
武当山导游词
2015/02/03 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
详解nginx location指令
2022/01/18 Servers
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python