博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录一篇redux-saga的基本使用过程
阅读量:6174 次
发布时间:2019-06-21

本文共 4590 字,大约阅读时间需要 15 分钟。

安装

npm install --save reduxnpm 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 = () =>  
;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 {            
test1的值为:{test1}
test2的值为:{test2}
test3的值为:{test3}
} }}const mapStateToProps = ({test}) => { const {test1,test2,test3} = test; return {test1,test2,test3}}export default connect (mapStateToProps,{setTest2Action, setTest3Action})(Test)

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

转载地址:http://oaqba.baihongyu.com/

你可能感兴趣的文章
vlan技术【实现】vlan简介和SVI实现不同vlan间通信
查看>>
scrapy爬虫初步尝试
查看>>
陈松松:视频制作不出来,跟这7个思维有九成关系
查看>>
形参和实参有何区别
查看>>
我的友情链接
查看>>
MySQL表结构的导入和导出MySQL表结构的导入和导出
查看>>
JavaSE 学习参考:Map容器遍历
查看>>
salt模块命令
查看>>
基于TBDS的flume异常问题排查过程
查看>>
2017/5 JavaScript基础7--- 数组
查看>>
网络时常断网的解决办法
查看>>
第八次作业及答案
查看>>
linux 日志定时清理脚本
查看>>
java老司机面试题
查看>>
Guice AOP
查看>>
懒汉式单例
查看>>
java递归组装树形结构
查看>>
手把手教你自己写一个模糊搜索的下拉框
查看>>
.Net文档图像处理工具包GdPicture.NET发布v14.0.30,改进PDF/OCR生成速度
查看>>
NetBSD 8.1 RC1 发布
查看>>