记录一篇关于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 相关文章推荐
Z-Blog中用到的js代码
Mar 15 Javascript
js树形控件脚本代码
Jul 24 Javascript
js格式化金额可选是否带千分位以及保留精度
Jan 28 Javascript
Js Jquery创建一个弹出层可加载一个页面
May 08 Javascript
Jquery实现由下向上展开效果的例子
Dec 08 Javascript
如何编写高质量JS代码
Dec 28 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
原生js代码实现图片放大境效果
Oct 30 Javascript
JavaScript瀑布流布局实现代码
May 06 Javascript
基于Vue生产环境部署详解
Sep 15 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
layui table 多行删除(id获取)的方法
Sep 12 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
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
简单介绍Python中的floor()方法
2015/05/15 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
python 爬取疫情数据的源码
2020/02/09 Python
python将数据插入数据库的代码分享
2020/08/16 Python
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书