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 相关文章推荐
执行iframe中的javascript方法
Oct 07 Javascript
Jquery动态更改一张位图的src与Attr的使用
Jul 31 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
Apr 15 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
php输出全部gb2312编码内的汉字方法
Mar 04 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
Angular2里获取(input file)上传文件的内容的方法
Sep 05 Javascript
Bootstrap Table 搜索框和查询功能
Nov 30 Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
Jul 20 Javascript
微信小程序实现可长按移动控件
Nov 01 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实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
javascript中的原型链深入理解
2014/02/24 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
Javascript动画效果(3)
2016/10/11 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
python制作企业邮箱的爆破脚本
2016/10/05 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python中def是做什么的
2020/06/10 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
自我鉴定范文
2013/11/10 职场文书
企业项目策划书
2014/01/11 职场文书
利群广告词
2014/03/20 职场文书
开业典礼主持词
2014/03/21 职场文书
公开服务承诺制度
2014/03/26 职场文书
运动会广播稿200字
2014/10/18 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
用python自动生成日历
2021/04/24 Python