記錄一篇關(guān)于redux-saga的基本使用過程
安裝
npm install --save redux npm install --save redux-saga
配置action
actionType
創(chuàng)建文件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
創(chuàng)建文件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等等。
創(chuàng)建文件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
}
}
創(chuàng)建文件src/reducers/index.js
import {combineReducers} from 'redux'
import test from './test'
const reducers = combineReducers({
test,
/*
還可以繼續(xù)加入其它的reducer文件,比如:
settings,
auth,
*/
});
export default reducers;
配置saga
創(chuàng)建文件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從網(wǎng)絡(luò)獲取數(shù)據(jù)演示,沒有安裝axios的需要先安裝它。
// 期間響應(yīng)狀態(tài)碼判斷就省略了,就當(dāng)它每次請求都成功獲得testValue的數(shù)據(jù)
response = axios.get('http://localhost/api/test')
// 假設(shè)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),
])
}
創(chuàng)建文件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();
// 使用數(shù)組是為了方便以后繼續(xù)添加中間件
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')}>設(shè)置test2的值為 abc</button>
</div>
<div>
test3的值為:{test3}
<button onClick={setTest3Action()}>從網(wǎng)絡(luò)獲取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進(jìn)行測試了
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js實現(xiàn)網(wǎng)頁自動刷新可制作節(jié)日倒計時效果
這篇文章主要介紹了通過js實現(xiàn)的網(wǎng)頁自動刷新,利用此功能可制作節(jié)日倒計時效果,需要的朋友可以參考下2014-05-05
JS中將blob返回值轉(zhuǎn)換為json格式的問題小結(jié)
這篇文章主要介紹了JS中如何將blob返回值轉(zhuǎn)換為json格式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12
javascript中RegExp保留小數(shù)點后幾位數(shù)的方法分享
文章介紹一篇關(guān)于javascript中RegExp保留小數(shù)點后幾位數(shù)方法,有需要了解的朋友可以參考一下2013-08-08
javascript從定義到執(zhí)行 你不知道的那些事
這篇文章主要介紹了javascript從定義到執(zhí)行,你不知道的那些事,感興趣的小伙伴們可以參考一下2016-01-01
利用Plupload.js解決大文件上傳問題, 帶進(jìn)度條和背景遮罩層
本篇文章主要介紹了c#+Plupload.js解決大容量文件上傳問題, 帶進(jìn)度條和背景遮罩層,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
javascript中不提供sleep功能如何實現(xiàn)這個功能
javascript中不提供sleep功能,而我們時長會用到這個功能,下面與大家分享個不錯的解決方法,而且在不同的機器上的執(zhí)行速度是一致的2014-05-05

