记录一篇关于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 相关文章推荐
Div Select挡住的解决办法
Aug 07 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
Oct 26 Javascript
js播放wav文件(源码)
Apr 22 Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 Javascript
node.js实现爬虫教程
Aug 25 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
Mar 08 Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 Javascript
详解离线安装npm包的几种方法
Nov 25 Javascript
async/await优雅的错误处理方法总结
Jan 30 Javascript
echarts大屏字体自适应的方法步骤
Jul 12 Javascript
微信小程序跨页面传递data数据方法解析
Dec 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
PHP简单选择排序算法实例
2015/01/26 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
2013/03/21 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python编码时应该注意的几个情况
2013/03/04 Python
python测试驱动开发实例
2014/10/08 Python
Python是编译运行的验证方法
2015/01/30 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
python处理csv中的空值方法
2018/06/22 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
承认错误的检讨书
2014/01/30 职场文书
腾讯广告词
2014/03/19 职场文书
元旦寄语大全
2014/04/10 职场文书
《菜园里》教学反思
2014/04/17 职场文书
行为规范主题班会
2015/08/13 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
Nginx速查手册及常见问题
2022/04/07 Servers