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 相关文章推荐
cloudgamer出品ImageZoom 图片放大效果
Apr 01 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
javascript+html5实现仿flash滚动播放图片的方法
Apr 27 Javascript
jQuery实现多级联动下拉列表查询框
Jan 18 Javascript
javascript实现简单计算器效果【推荐】
Apr 19 Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
基于Proxy的小程序状态管理实现
Jun 14 Javascript
使用layui的layer组件做弹出层的例子
Sep 27 Javascript
JavaScript实现点击出现子菜单效果
Feb 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
linux下为php添加curl扩展的方法
2011/07/29 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
jquery下div 的resize事件示例代码
2014/03/09 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
jQuery实现放大镜案例
2020/10/19 jQuery
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python socket套接字实现C/S模式远程命令执行功能案例
2018/07/06 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
python如何控制进程或者线程的个数
2020/10/16 Python
详解python polyscope库的安装和例程
2020/11/13 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
英语自荐信常用语句
2013/12/13 职场文书
同学聚会欢迎辞
2014/01/14 职场文书
销售口号大全
2014/06/11 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
天那边观后感
2015/06/09 职场文书
Python基础之hashlib模块详解
2021/05/06 Python