国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

記錄一篇關于redux-saga的基本使用過程

2024-05-06 16:45:47
字體:
來源:轉載
供稿:網友

安裝

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 = () => <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進行測試了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瑞昌市| 天峻县| 尉犁县| 博客| 木兰县| 星子县| 广平县| 厦门市| 神农架林区| 江阴市| 洪雅县| 广西| 南皮县| 青冈县| 鲜城| 北流市| 博罗县| 阜平县| 海南省| 克山县| 卓尼县| 鹤壁市| 石屏县| 大理市| 兴安县| 卓尼县| 曲水县| 永登县| 隆德县| 洞口县| 肃南| 青海省| 孝感市| 云南省| 德化县| 云霄县| 安福县| 灵宝市| 汨罗市| 兰溪市| 江阴市|