最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

记录一篇关于redux-saga的基本使用过程

来源:动视网 责编:小采 时间:2020-11-27 22:09:41
文档

记录一篇关于redux-saga的基本使用过程

记录一篇关于redux-saga的基本使用过程:安装 npm install --save redux npm install --save redux-saga 配置action actionType 创建文件src/actions/types.js,在types.js文件中添加需要的action类型 export const TEST1_ACTION = 'test1'; e
推荐度:
导读记录一篇关于redux-saga的基本使用过程:安装 npm install --save redux npm install --save redux-saga 配置action actionType 创建文件src/actions/types.js,在types.js文件中添加需要的action类型 export const TEST1_ACTION = 'test1'; e


安装

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进行测试了

文档

记录一篇关于redux-saga的基本使用过程

记录一篇关于redux-saga的基本使用过程:安装 npm install --save redux npm install --save redux-saga 配置action actionType 创建文件src/actions/types.js,在types.js文件中添加需要的action类型 export const TEST1_ACTION = 'test1'; e
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top