安装
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,使用
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。