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 组件之旅(四):测试 JavaScript 组件
Oct 28 Javascript
javascript下数值型比较难点说明
Jun 07 Javascript
javascript 实用的文字链提示框效果
Jun 30 Javascript
jquery下为Event handler传递动态参数的代码
Jan 06 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
Aug 15 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
script标签属性用type还是language
Jan 21 Javascript
如何理解Vue的render函数的具体用法
Aug 30 Javascript
Node.js 使用AngularJS的方法示例
May 11 Javascript
深入剖析JavaScript instanceof 运算符
Jun 14 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 Javascript
JS实现transform实现扇子效果
Jan 17 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
PHP获取文件绝对路径的代码(上一级目录)
2011/05/29 PHP
php url路由入门实例
2014/04/23 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
js确定对象类型方法
2012/03/30 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
Python中的urllib模块使用详解
2015/07/07 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
pycharm永久激活超详细教程
2020/10/29 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
一套比较完整的软件测试人员面试题
2012/05/13 面试题
社会治安综合治理责任书
2015/01/29 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python