记录一篇关于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 相关文章推荐
javascript获取web应用根目录的方法
Feb 12 Javascript
浅谈js 闭包引起的内存泄露问题
Jun 22 Javascript
javascript封装的sqlite操作类实例
Jul 17 Javascript
AngularJS在IE8的不支持的解决方法
May 13 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
May 23 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
VUE+node(express)实现前后端分离
Oct 13 Javascript
vue-router 控制路由权限的实现
Sep 24 Javascript
Vue项目打包部署到apache服务器的方法步骤
Feb 01 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
基于mysql的bbs设计(四)
2006/10/09 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
php命令行模式代码实例详解
2021/02/26 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
cookie的secure属性详解
2015/04/08 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
2020/02/12 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
python切换hosts文件代码示例
2013/12/31 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
简单了解什么是神经网络
2017/12/23 Python
Python线程同步的实现代码
2018/10/03 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
国旗下的讲话演讲稿
2014/05/08 职场文书
关于学习的演讲稿
2014/05/10 职场文书
六一儿童节标语
2014/10/08 职场文书
初中毕业生自我评价
2015/03/02 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
演讲开头怎么书写?
2019/08/06 职场文书