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 相关文章推荐
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
jquery导航制件jquery鼠标经过变色效果示例
Dec 05 Javascript
Jquery弹出层插件ThickBox的使用方法
Dec 09 Javascript
JavaScript对象创建模式实例汇总
Oct 03 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
JS实现简单拖拽效果
Jun 21 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
Feb 11 Javascript
js中数组对象去重的两种方法
Jan 18 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
May 24 Javascript
JavaScript 判断数据类型的4种方法
Sep 11 Javascript
微信小程序:报错(in promise) MiniProgramError
Oct 30 Javascript
Vue实现购物车基本功能
Nov 08 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
php 删除记录实现代码
2009/03/12 PHP
PHP输入流php://input介绍
2012/09/18 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
List Installed Hot Fixes
2007/06/12 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
用Django写天气预报查询网站
2018/10/21 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
北京振戎融通Java面试题
2015/09/03 面试题
公司联欢晚会主持词
2014/03/22 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
2015会计试用期工作总结
2014/12/12 职场文书
我爱我班主题班会
2015/08/13 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
七个非常实用的Python工具包总结
2021/06/15 Python