记录一篇关于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 相关文章推荐
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
Jquery 组合form元素为json格式,asp.net反序列化
Jul 09 Javascript
在js文件中写el表达式取不到值的原因及解决方法
Dec 23 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
微信jssdk在iframe页面失效问题的解决措施
Mar 03 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
angularjs+bootstrap实现自定义分页的实例代码
Jun 19 Javascript
JavaScript设计模式之构造函数模式实例教程
Jul 02 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
layui弹出框Tab选项卡的示例代码
Sep 04 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
php5 mysql分页实例代码
2008/04/10 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php流量统计功能的实现代码
2012/09/29 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
Vue项目中如何引入icon图标
2018/03/28 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
微信小程序中限制激励式视频广告位显示次数(实现思路)
2019/12/06 Javascript
Python实现求数列和的方法示例
2018/01/12 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
谈谈Python中的while循环语句
2019/03/10 Python
Python3简单实现串口通信的方法
2019/06/12 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
介绍一下Python下range()函数的用法
2013/11/07 面试题
毕业自荐信
2013/12/16 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
护林防火标语
2014/06/27 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
庆国庆活动总结
2014/08/28 职场文书
防汛工作情况汇报
2014/10/28 职场文书
施工员岗位职责范本
2015/04/11 职场文书
Python使用Web框架Flask开发项目
2022/06/01 Python