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 相关文章推荐
非常漂亮的JS代码经典广告
Oct 21 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
Apr 16 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
常用的Javascript数据验证插件
Aug 04 Javascript
jQuery实现下拉加载功能实例代码
Apr 01 Javascript
浏览器兼容的JS写法总结
Apr 27 Javascript
原生JavaScript编写canvas版的连连看游戏
May 29 Javascript
js中通过getElementsByName访问name集合对象的方法
Oct 31 Javascript
原生js实现移动端Touch轮播图的方法步骤
Jan 03 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
Mar 19 jQuery
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 Javascript
解决vue+elementui项目打包后样式变化问题
Aug 03 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
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
xml转json的js代码
2012/08/28 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
python3制作捧腹网段子页爬虫
2017/02/12 Python
Python编程之gui程序实现简单文件浏览器代码
2017/12/08 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
目前最全的python的就业方向
2018/06/05 Python
如何优雅地处理Django中的favicon.ico图标详解
2018/07/05 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
盛大笔试题
2016/11/05 面试题
房地产融资计划书
2014/01/10 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
学校通报表扬范文
2015/05/04 职场文书
党小组推荐意见
2015/06/02 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript