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 得到文件后缀名的思路及实现
May 09 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
Dec 02 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
js实现div色块碰撞
Jan 16 Javascript
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 Javascript
JS实现简易图片自动轮播
Oct 16 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 Javascript
详解实现vue的数据响应式原理
Jan 20 Vue.js
如何封装Vue Element的table表格组件
Feb 06 Vue.js
基于游标的分页接口实现代码示例
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获取某个目录大小的代码
2008/09/10 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
用javascript实现自定义标签
2007/05/08 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
Vue-Router模式和钩子的用法
2018/02/28 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
python简单实现获取当前时间
2016/08/27 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
详解python的argpare和click模块小结
2019/03/31 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python request使用方法及问题总结
2020/04/26 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
简单的项目建议书模板
2014/03/12 职场文书
企业法人授权委托书
2014/04/03 职场文书
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
学校工会工作总结2015
2015/05/19 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript
vue如何清除浏览器历史栈
2022/05/25 Vue.js