记录一篇关于redux-saga的基本使用过程


Posted in Javascript onAugust 18, 2018

安装

npm install --save redux
npm install --save redux-saga

配置action

actionType

创建文件src/actions/types.js,在types.js文件中添加需要的action类型

export const TEST1_ACTION = 'test1';
export const SET_TEST2_ACTION = 'change_test2';
export const SET_TEST3_ACTION = 'change_test3';

createActions

创建文件src/actions/test.js,在test.js文件中编写action

import {TEST1_ACTION, SET_TEST2_ACTION, SET_TEST3_ACTION} from './types

// 获取test1的值
export const getTest1Action = () => {
  return {
    type:TEST1_ACTION
  }
}

// 写入test2的值
export const setTest2Action = (testValue) => {
  return {
    type:SET_TEST2_ACTION,
    payload:testValue
  }
}

// 写入test3的值
export const setTest3Action = (payload) => {
  return {
    type:SET_TEST3_ACTION,
    payload
  }
}

配置reducer

因为一个项目中可能会有很多地方需要用到reducer,所以把这些reducer文件分开管理比较好,比如:test.js,settings.js,auth.js等等。

创建文件src/reducers/test.js,编写test reducer

import {TEST1_ACTION, SET_TEST2_ACTION, SET_TEST3_ACTION} from '../actions/types

// 初始化
const initTest = {
  test1:'这是test1初始化的值',
  test2:'这是test2初始化的值',
  test3:'这是test3初始化的值'
}

export default (state = initTest, action) =>{
  switch (action.type) {
    case TEST1_ACTION:{
      return {
        ...state
      }
    }
    case SET_TEST2_ACTION:{
      return {
        ...state,
        test2:action.payload
      }
    }
    case SET_TEST3_ACTION:{
      return {
        ...state,
        test3:action.payload.testValue
      }
    }
    default:
    return state
  }
}

创建文件src/reducers/index.js

import {combineReducers} from 'redux'
import test from './test'


const reducers = combineReducers({
  test,
  /*
  还可以继续加入其它的reducer文件,比如:
  settings,
  auth,
  */
});

export default reducers;

配置saga

创建文件src/sagas/test.js

import {all,fork,put,takeEvery} from 'redux-saga/effects'
import {setTest2Action, setTest3Action} from "../actions/test"
import {SET_TEST2_ACTION, SET_TEST3_ACTION} from "../actions/actionTypes"
import axios from 'axios'

function* changeTest2 (testValue) {
  yield put(setTest2Action(testValue))
}

function* changeTest3 (obj) {
  try{
    // 这里使用axios从网络获取数据演示,没有安装axios的需要先安装它。
    // 期间响应状态码判断就省略了,就当它每次请求都成功获得testValue的数据
    response = axios.get('http://localhost/api/test')
    
    // 假设response.data里面有一个key为testValue的值
    yield put(setTest3Action(response.data))
  } catch (error) {
    console.error('这里也可以yield put一个createAction,这里不作演示')
  }
}

export function* setTest2 () {
  yield takeEvery(SET_TEST2_ACTION, changeTest2)
}

export function* setTest3 () {
  yield takeEvery(SET_TEST3_ACTION, changeTest3)
}

export default function* testSaga(){
  yield all([
    fork(setTest2),
    fork(setTest3),
  ])
}

创建文件src/sagas/index.js

import {all} from 'redux-saga/effects';
import testSaga from './test'

export default function* rootSaga() {
  yield all([
    testSaga()
  ]);
}

配置store

import {applyMiddleware, compose, createStore} from 'redux';
import reducers from '../reducers/index';
import createSagaMiddleware from 'redux-saga';
import rootSaga from '../sagas/index';


const sagaMiddleware = createSagaMiddleware();

// 使用数组是为了方便以后继续添加中间件
const middlewares = [sagaMiddleware];

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
 reducers,
 composeEnhancers(applyMiddleware(...middlewares))
);

sagaMiddleware.run(rootSaga);

export default store;

App入口文件路由配置

import React from 'react'
import {Provider} from 'react-redux'
import store from './store'
import Test from './Test/'
import {BrowserRouter, Route, Switch} from "react-router-dom"

const MainApp = () =>
 <Provider store={store}>
  <BrowserRouter>
   <Switch>
    <Route path="/" component={Test}/>
   </Switch>
  </BrowserRouter>
 </Provider>;

export default MainApp

Test.js

src/Test/index.js

import React from 'react'
import {connect} from 'react-redux'
import {setTest2Action, setTest3Action} from '../actions/test'

class Test extends React.Component {
  render() {

    const {test1, test2, test3, setTest2Action, setTest3Action} = this.props

    return {
      <div>
        <div>
          test1的值为:{test1}
        </div>
        <div>
          test2的值为:{test2}
          <button onClick={setTest2Action('abc')}>设置test2的值为 abc</button>
        </div>
        <div>
          test3的值为:{test3}
          <button onClick={setTest3Action()}>从网络获取test3的值</button>
        </div>
      </div>
    }
  }
}

const mapStateToProps = ({test}) => {
  const {test1,test2,test3} = test;
  return {test1,test2,test3}
}

export default connect (mapStateToProps,{setTest2Action, setTest3Action})(Test)

至此,即可运行 npm start进行测试了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
SUN的《AJAX与J2EE》全文译了
Feb 23 Javascript
jQuery UI AutoComplete 自动完成使用小记
Aug 21 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
Apr 18 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
Nov 28 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
动态更新highcharts数据的实现方法
May 28 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
Sep 02 Javascript
AngularJS 异步解决实现方法
Jun 12 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
JavaScript 高性能数组去重的方法
Sep 20 Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 Javascript
javascript sort()对数组中的元素进行排序详解
Oct 13 Javascript
Vue实现6位数密码效果
Aug 18 #Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 #Javascript
详解Angular6 热加载配置方案
Aug 18 #Javascript
Vue+element-ui 实现表格的分页功能示例
Aug 18 #Javascript
vue下history模式刷新后404错误解决方法
Aug 18 #Javascript
详解javascript appendChild()的完整功能
Aug 18 #Javascript
vue中的自定义分页插件组件的示例
Aug 18 #Javascript
You might like
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
python实现的希尔排序算法实例
2015/07/01 Python
Python的多态性实例分析
2015/07/07 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
函授教育个人学习的自我评价
2013/12/31 职场文书
便利店促销方案
2014/02/20 职场文书
父母对孩子的寄语
2014/04/09 职场文书
总经理检讨书
2014/09/15 职场文书
入股合作协议书
2014/10/12 职场文书
安全检查汇报材料
2014/12/26 职场文书
会计工作岗位职责
2015/02/03 职场文书
不同意离婚答辩状
2015/05/22 职场文书
歌舞青春观后感
2015/06/10 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA