react-redux--搭配react

先熟悉兩個方法(大概瀏覽下即可,根據(jù)后面的例子對照學(xué)習(xí))
bindActionCreator(actionCreators, dispatch)


使用dispatch將一個action creator(action創(chuàng)建函數(shù),前面有提到)禽炬,或者一個 value 是 action creator 的對象進(jìn)行包裝曾我,以便可以在react組件里面直接調(diào)用他們。

入?yún)?/strong>

  1. actionCreators :Function | Object
  2. dispatch: Function撵彻。
第一個入?yún)⑹莂ction creator函數(shù)
const toggleTodo = (id) => {
    return {
        type: 'TOGGLE_TODO',
        id
    };
};

let boundActionCreators = bindActionCreators(toggleTodo, dispatch);
//此時boundActionCreators  = (id) => dispatch(toggleTodo(id));

第一個入?yún)⑹莢alue為action action對象
const removeTodo = {
    removeTodo : id => {
      type: 'REMOVE_TODO',
      id
    }
};
let boundActionCreators = bindActionCreators(removeTodo, dispatch);
//此時boundActionCreators  = (id) => dispatch(removeTodo(id));

所以bindActionCreator實現(xiàn)思路就是

  • 判斷傳入第一個的參數(shù)是否是object钓株,如果是函數(shù)实牡,就直接返回一個包裹dispatch的函數(shù)
  • 如果是object,就根據(jù)相應(yīng)的key轴合,生成包裹dispatch的函數(shù)即可

(隨口一問:為什么要用dispath包裹呢 创坞?想想上一篇的內(nèi)容吧~~)

connect(...)

  • 將Redux store和React組件聯(lián)系在一起
  • connenct并不會改變它“連接”的組件,而是提供一個經(jīng)過包裹的connect組件受葛。
connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)

入?yún)?/strong>

接受4個不同的题涨,可選擇的參數(shù)。按照慣例总滩,他們被稱為:

  1. mapStateToProps?: Function
  2. mapDispatchToProps?: Function | Object
  3. mergeProps?: Function
  4. options?: Object
mapStateToProps?: (state, ownProps?) => Object
  • 用于建立組件跟store的state的映射關(guān)系
  • 作為一個函數(shù)纲堵,它可以傳入兩個參數(shù)(state, ownProps?)闰渔,結(jié)果一定要返回一個object
  • 傳入mapStateToProps之后席函,會訂閱store的狀態(tài)改變,在每次store的state發(fā)生變化的時候冈涧,都會被調(diào)用
  • ownProps代表組件本身的props茂附,如果寫了第二個參數(shù)ownProps,那么當(dāng)prop發(fā)生變化的時候督弓,mapStateToProps也會被調(diào)用营曼。例如,當(dāng) props接收到來自父組件一個小小的改動愚隧,那么你所使用的 ownProps 參數(shù)蒂阱,mapStateToProps 都會被重新計算)。
  • 如果不想訂閱store的更新狂塘,在connect()中录煤,可以直接將mapStateToProps方法用null 或者undefined代替
一個參數(shù)
const mapStateToProps = state => ({ todos: state.todos })

兩個參數(shù)
const mapStateToProps = (state, ownProps) => ({
  todo: state.todos[ownProps.id]
})

mapDispatchToProps?: Object | (dispatch, ownProps?) => Object
  • mapDispatchToProps用于建立組件跟store.dispatch的映射關(guān)系

  • 它可以是一個對象或者是帶有兩個參數(shù)(dispatch, ownProps?)的函數(shù) ,結(jié)果一定要返回一個object

  • 如果mapDispatchToProps是一個函數(shù),調(diào)用時最多使用兩個參數(shù)荞胡,如下

一個參數(shù)
const mapDispatchToProps = dispatch => {
  return {
    // dispatching plain actions
    increment: () => dispatch({ type: 'INCREMENT' }),
    decrement: () => dispatch({ type: 'DECREMENT' }),
    reset: () => dispatch({ type: 'RESET' })
  }
}
兩個參數(shù)
// binds on component re-rendering
;<button onClick={() => this.props.toggleTodo(this.props.todoId)} />

// binds on `props` change
const mapDispatchToProps = (dispatch, ownProps) => {
  toggleTodo: () => dispatch(toggleTodo(ownProps.todoId))
}

  • 如果mapDispatchToProps是一個object辐赞,其中這個object所對應(yīng)的value必須是actionCreator,這樣redux里面會自動幫我們調(diào)用bindActionCreator
const mapDispatchToProps = {
    ...action
}

  • 如果想使用默認(rèn)的dispath方法硝训,在connect()中响委,可以將mapDispatchToProps方法用null代替
// do not pass `mapDispatchToProps`
connect()(MyComponent)
connect(mapState)(MyComponent)
connect(
  mapState,
  null,
  mergeProps,
  options
)(MyComponent)
mergeProps?: (stateProps, dispatchProps, ownProps) => Object
  • 將mapStateToProps(), mapDispatchToProps()以及組件自身的props合并
  • 暫時忽略,期待后續(xù)
options?: Object
  • 暫時忽略窖梁,期待后續(xù)

廢話不說赘风,上圖

這是一個很常見的“輸入框校驗”需求,根據(jù)用戶輸入的數(shù)字纵刘,判斷是否符合要求(輸入必須為1000的整數(shù)倍)邀窃,給予相應(yīng)的文字提示。

下面我們就使用react-redux來處理這個需求吧~~

  • 動手寫代碼之前,先考慮下有哪些state
    “錯誤信息提示” -errorMsg
  • 各個state有哪些操作可以修改
    既是考慮下action的type的取值

action.js
--------------------------
showMutipleMsg(errorMsg){
    type:"MUTIPLE_ERROR_MESSAGE",
    errorMsg:"輸入金額需為1瞬捕,000的整數(shù)"
}
showMinMsg(errorMsg){
    type:"MIN_ERROR_MESSAGE",
    errorMsg:"輸入金額需不能小于2鞍历,000元"
}
 
--------------------------
//上面兩個action都是對一個state的描述,操作類型相似肪虎,我們可以通過“action創(chuàng)建函數(shù)”改寫:
changeErrorMsg(errorMsg){
    return {
        type:"CHANGE_ERROR_MESSAGE",
        errorMsg
    }
}
//action創(chuàng)建函數(shù)劣砍,其實就是生成 action 的方法,這樣做將使 action 更容易被移植和測試。


觸發(fā)函數(shù)扇救,子分類的reducer
pageReducer.js

//校驗輸入框的reducer
export const pageReducer = function(state={errorMsg:''},action) {

    switch (action.type) {
        case 'CHANGE_ERROR_MESSAGE':
            console.log("action==",action);
            return Object.assign({}, state, {
                errorMsg: action.errorMsg
            })

        default:
            return state
    }

} 


//根部reducer
rootReducer.js
import { combineReducers } from 'redux'
import {pageReducer} from './pageReducer'
//這里有意使用了combineReducers
const rootReducer = combineReducers({
    page:pageReducer,
});
export  default rootReducer;
被觸發(fā)的組件
InputError.js

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'

class InputError extends Component {

    static propTypes = {
        errorMsg: PropTypes.string
    }

    render () {
        return (
            <div className="error-message">
                {this.props.errorMsg }
            </div>
        )
    }
}

const mapStateToProps = (state) => {
    console.log(state);
    return {
        errorMsg: state.page.errorMsg
    }
}


export default connect(mapStateToProps)(InputError) 
組件中的觸發(fā)
Input.js
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import {changeErrorMsg} from '../actions/actionPage'

class Input extends Component {

    constructor(props){
        super(props);
        this.handleSwitchError = this.handleSwitchError.bind(this);
    }

    static propTypes = {
        onSwitchErrorMessage: PropTypes.func
    }

    handleSwitchError (event) {
        /**
         * 各種計算校驗刑枝,這里只做了1000整數(shù)倍的校驗如果不符合規(guī)范,dispatch action 去顯示錯誤信息
         *
         */
        let errorMsg = '';
        const value = event.target.value;
        if( value % 1000 !== 0){
            errorMsg = '請輸入1000的整數(shù)倍';
        }

        if (this.props.onSwitchErrorMessage) {
            this.props.onSwitchErrorMessage(errorMsg);
        }

    }

    render () {
        return (
                <div>
                    <input  onChange={ this.handleSwitchError } maxLength={9}/>
                </div>
        )
    }

}

const mapDispatchToProps = (dispatch) => {
        return {
            onSwitchErrorMessage: (errorMsg) => {
            dispatch(changeErrorMsg(errorMsg))
        }
    }
}


export default connect(null, mapDispatchToProps)(Input);
 
入口文件
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import Input from './containers/Input'
import InputError from './containers/InputError'
import rootReducer  from './reducers/rootReducer'
import './index.css'

const store = createStore(rootReducer);
//console.log("=====store.getState====",store.getState());

class Index extends Component {

    render () {
        return (
            <div>
                <Input />
                <InputError/>
            </div>
        )
    }
}

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

下一章 react-redux--異步Action

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迅腔,一起剝皮案震驚了整個濱河市装畅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沧烈,老刑警劉巖掠兄,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锌雀,居然都是意外死亡徽千,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門汤锨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人百框,你說我怎么就攤上這事闲礼。” “怎么了铐维?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵柬泽,是天一觀的道長。 經(jīng)常有香客問我嫁蛇,道長锨并,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任睬棚,我火速辦了婚禮第煮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抑党。我一直安慰自己包警,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布底靠。 她就那樣靜靜地躺著害晦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暑中。 梳的紋絲不亂的頭發(fā)上壹瘟,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天鲫剿,我揣著相機(jī)與錄音,去河邊找鬼稻轨。 笑死灵莲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澄者。 我是一名探鬼主播笆呆,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粱挡!你這毒婦竟也來了赠幕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤询筏,失蹤者是張志新(化名)和其女友劉穎榕堰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫌套,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逆屡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踱讨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魏蔗。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痹筛,靈堂內(nèi)的尸體忽然破棺而出莺治,到底是詐尸還是另有隱情,我是刑警寧澤帚稠,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布谣旁,位于F島的核電站,受9級特大地震影響滋早,放射性物質(zhì)發(fā)生泄漏榄审。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一杆麸、第九天 我趴在偏房一處隱蔽的房頂上張望搁进。 院中可真熱鬧,春花似錦昔头、人聲如沸拷获。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匆瓜。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驮吱,已是汗流浹背茧妒。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留左冬,地道東北人桐筏。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拇砰,于是被迫代替她去往敵國和親梅忌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361