react-redux的使用

定义redux的基本文件

第一步:store.js文件(银行)

  • 1.新建一个store,createStore需要传入一个(state,action)=>{}的箭头函数,以及saga的中间件并应用该中间件applyMiddleware(sagaMiddleware)
  • 2.新建一个saga的中间件sagaMiddleware = createSagaMiddleware(),并启动中间件sagaMiddleware.run(mySaga)
  • 3.启动saga中间件,需要传入saga的js文件mySaga
import {createStore, compose, applyMiddleware} from 'redux'
import createSagaMiddleware from 'redux-saga'
import reducers from './reducers'
import mySaga from './sagas'

//创建saga中间件
const sagaMiddleware = createSagaMiddleware()

//兼容性的考虑
const composeEnhancers =
    typeof window === 'object' &&
    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
        window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose;

//创建一个store,reducers外部引入存放(state,action)=>{}; 
//applyMiddleware(sagaMiddleware)引入中间件
const store = createStore(reducers, applyMiddleware(sagaMiddleware))

//运行saga,mySaga的逻辑引入
//https://github.com/redux-saga/redux-saga
sagaMiddleware.run(mySaga)

export default store

第二步:reducers.js文件(业务经理)

  • 1.定义一个(state,action)=>{return}箭头函数,给予新建createStore的传参
  • 2.state = defaultState设置一个默认值,定义redux来维护的数据存储
  • 3.action为一个结构体,action.type定义了action的类型,以及必要的行为参数
  • 4.import {INIT_DATA} from './actionTypes'统一action的行为类型,避免出错
import {INIT_DATA} from './actionTypes'

const defaultState = {
    list: [],
}

export default (state = defaultState, action) => {

    if (action.type === INIT_DATA) {
        const newState = JSON.parse(JSON.stringify(state))
        newState.list = [{
            text: 'welcome',
            url: '/welcome'
        },
            {
            text: 'goods',
            url: '/goods'
        },
        ]
        return newState
    }

    return state
}

第三步 actionCretors.js(客户经理)

  • 1.actionCretors定义具体action的行为,具体包括action的行为类型,以及行为依赖的参数
  • 2.action定义基本类型为一个对象()=>({})
  • 3.import {INIT_DATA} from './actionTypes'统一action的行为类型,避免出错
import {INIT_DATA} from './actionTypes'

//初始化数据
export const initDataAction = ()=>({
    type:INIT_DATA
})

直至基本完成的redux的定义
1.新建一个银行store,store里面需要有具体的业务经理,即reducer。createStore(reducer, appleMiddleware()),需要传入reducer。
2.reducer业务经理,需要与客户经理对接,之间的沟通方式就是action.type(即业务类型)。reducer的定义是(state,action)=>{}, state为存储的数据结构,action为行为。
3.action为客户经理,需要具体业务的类型action.type,以及办理业务需要的材料action.param。action行为的基本定义()=>({type:${type}, ...})。

react-redux

相比原始的redux,使用react-redux下的connect统一监听store的数据变化

具体使用步骤:

步骤一:yarn add react-redux
步骤二:在index.js最外层的html标签套一个<Provider store={store}></Provider>,是的react-redux能够维护store的数据变化
步骤三:export default connect(mapStateToProps, mapDispatchToProps)(App);其中mapStateToProps将store的state赋值给当前控件props,mapDispatchToProps将action赋值给当前控件props

案例

//index.js
//<Provider>最外层,目的是App下的标签都被react-redux所监听管理到

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
  document.getElementById('root')
);


//App.js
import './App.css';
import React from 'react'
import {connect} from 'react-redux'
import {addBookAction} from './store/actionCretors'

class App extends React.Component {
    constructor(props) {
        super(props);
    }
//按点响应函数,去执行action
    addBook = ()=>{
        //action被赋值了addBook行为
        this.props.addBook()
    }
    render() {
        const {list} = this.props
        return (
            <div className="App">
                <button onClick={this.addBook}>添加book</button>
                {
                    list.map((temp, index)=>{
                        return (
                            <li key={index}>
                                {temp.text}
                            </li>
                        )
                    })
                }
            </div>
        );
    }
}

//react-redux将store的state赋值给当前控件的props
const mapStateToProps = (state) => {
    return {
        // 将state.list赋值当前控件的props,即this.props.list=store.state.list
        list:state.list
    }
}

//react-redux将store的actions行为赋值给当前控件的props
const mapDispatchToProps = (dispatch) => {
    return {
        addBook() {
            const action = addBookAction()
            dispatch(action)
        },
    }
}

//react-redux的connect固定调用
export default connect(mapStateToProps, mapDispatchToProps)(App);

saga配置

saga的作用是接受函数型的action,而不是像redux只能接受对象型的action。
具体使用规则:
步骤一:yarn add redux-saga
步骤二:新建sagas.js文件,具体参考git说明https://github.com/redux-saga/redux-saga

  • takeEvery()将行为类型与行为操作进行关联
  • 行为操作使用put再次去调用redux
//定义一个函数,用于监听到行为后对应的操作
function* addSagaData() {
    console.log('addSagaData')
    const list = {
        text: 'sagaData',
        url: '/sagaData',
    }
//异步,执行redux下的action
    yield put({
      //行为类型
      type:ADD_BOOK_SAGA_RECV,
      //行为参数
      list:list,
    })
}

function* mySaga() {
//将ADD_BOOK_SAGA_SEND与函数addSagaData进行关联
    yield takeEvery(ADD_BOOK_SAGA_SEND, addSagaData);
}

export default mySaga;

步骤三:reducers.js根据action.type定义行为

import {ADD_BOOK, ADD_BOOK_SAGA_RECV} from './actionTypes'


export default (state = defaultState, action) => {
    //saga行为操作通过yield put异步发送redux
    if (action.type == ADD_BOOK_SAGA_RECV){
        const newState = JSON.parse(JSON.stringify(state))
        newState.list.push(action.list)
        return newState
    }

    return state
}

步骤四:App.js中的使用,与react-redux一致

//1.mapDispatchToProps定义saga的方法
const mapDispatchToProps = (dispatch) => {
    return {
        addSagaList(){
            console.log('saga')
            const action = addBookSagaSendAction()
            dispatch(action)
        }
    }
}
//2.props方法进行调用
<button onClick={this.props.addSagaList}>saga测试</button>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容