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 相关文章推荐
在JavaScript中使用inline函数的问题
Mar 08 Javascript
Jquery中ajax方法data参数的用法小结
Feb 12 Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
JavaScript 数组中最大最小值
Jun 05 Javascript
vue.js初学入门教程(2)
Nov 07 Javascript
Vue2.x中的父子组件相互通信的实现方法
May 02 Javascript
一次围绕setTimeout的前端面试经验分享
Jun 15 Javascript
JS实现自定义状态栏动画文字效果示例
Oct 12 Javascript
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
vue+element+Java实现批量删除功能
Apr 08 Javascript
原生js代码能实现call和bind吗
Jul 31 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
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
基于Vue单文件组件详解
2017/09/15 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
浅析Python编写函数装饰器
2016/03/18 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Python短信轰炸的代码
2020/03/25 Python
python中如何进行连乘计算
2020/05/28 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
政府个人对照检查材料
2014/08/28 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
2015团员个人年度总结
2015/11/24 职场文书
Python装饰器详细介绍
2022/03/25 Python