初探Redux

最近剛剛開(kāi)始入坑React陡鹃,妙不可言算撮。其中比較復(fù)雜繁瑣的就是這個(gè)Redux,之前Vuex用起來(lái)非常的簡(jiǎn)單亿柑。

說(shuō)下核心的一個(gè)流程邢疙,Redux做的主要是一個(gè)狀態(tài)的集中管理,React能控制的狀態(tài)其實(shí)就state和prop,redux就屬于后者秘症。view層做一個(gè)操作,就會(huì)去觸發(fā)一個(gè)Action式矫。Action會(huì)給一個(gè)reducer傳入一個(gè)新的對(duì)象乡摹,然后我們的核心其實(shí)就是reducer去改變我們的store。比較坑的就是這個(gè)action默認(rèn)只能搞同步事件采转,異步的話聪廉,就要用到中間件,這個(gè)后序會(huì)來(lái)填坑的故慈。

state -》action -》dispatch -》middleware -》reducer -》 store change -》 prop change -》refresh

基本流程用起來(lái)沒(méi)有Vuex那樣簡(jiǎn)單粗暴板熊,但就我現(xiàn)在的理解來(lái)說(shuō),做的一個(gè)差不多的事情察绷。


從源頭store說(shuō)起

redux的store其實(shí)就是個(gè)reducer干签,每次返回的都是新對(duì)象(這個(gè)問(wèn)題后序填坑)

import * as Redux from 'redux'
import LIGHT from '../constants/key-mirror'
const initState = {
    color: 'red',
    isLoading: false
}


function light(state=initState, action) {
    switch(action.type) {
        case LIGHT.CHANGE_GREEN:
            return {
                color: 'green',
                isLoading: false
            }
        case LIGHT.CHANGE_YELLOW:
            return {
                color: 'yellow',
                isLoading: action.isLoading,
                text: action.text
            }
        case LIGHT.CHANGE_RED:
            return Object.assign({}, initState)
            
        default:
            return state
    }
}

const rootReducer = Redux.combineReducers({
    light
})

export default rootReducer

這邊一個(gè)重點(diǎn)的函數(shù)Redux.combineReducers,后序填坑拆撼,第一次初探容劳,主要以使用為主

有了Reducer了就該創(chuàng)建Store了

import rootReducer from '../reducers/index'
import * as Redux from 'redux'
import thunkMiddleware from 'redux-thunk'

export default function (initState) {
    return Redux.createStore(rootReducer, initState, Redux.applyMiddleware(thunkMiddleware))
}

這個(gè)thunkMiddleware中間件就是用來(lái)解決異步問(wèn)題的,后序會(huì)對(duì)齊源碼進(jìn)行剖析闸度。


有了store了竭贩,就可以使用了

import App from './container/index.js'
import ReactDOM from 'react-dom'
import React from 'react'
import {Provider} from 'react-redux'
import configureStore from './store/configure-store'
import './assets/index.css'
const store = configureStore()

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

到現(xiàn)在為止,其實(shí)store中的數(shù)據(jù)其實(shí)已經(jīng)可以map到組件的props上了


使用action對(duì)我們的store進(jìn)行賦能

import lights from '../constants/key-mirror'

export function changeyellow() {
    return (dispatch, getState) => {
        setTimeout(() => {
            dispatch({type: lights.CHANGE_YELLOW, isloading: false})
        }, 1000);
    }
}



export function changegreen() {
    return (dispatch, getState) => {
        setTimeout(() => {
            dispatch({type: lights.CHANGE_GREEN, isloading: false})
        }, 1000);
    }
}


export function changered() {
    return (dispatch, getState) => {
        setTimeout(() => {
            dispatch({type: lights.CHANGE_RED, isloading: false})
        }, 1000);
    }
}

萬(wàn)事俱備莺禁,統(tǒng)統(tǒng)連起來(lái)

function mapStateToProps (state) {
    return {
        data: state
    }
}

function mapDispatchToProps (dispatch) {
    return {
        actions: Redux.bindActionCreators(LightActions, dispatch)
    }
}

ReactRedux.connect(mapStateToProps, mapDispatchToProps)(App)

其實(shí)就是個(gè)高階組件留量,把props傳過(guò)去了而已。當(dāng)點(diǎn)擊事件觸發(fā):

handleClick(e) {
      let _cname = e.target.className
      if(_cname === 'red') {
          _cname = 'green'
      } else {
          _cname = 'yellow'
      }    
      const {actions} = this.props 
      actions['change' + _cname]()
}

后續(xù)會(huì)對(duì)其的復(fù)雜應(yīng)用和實(shí)現(xiàn)原理哟冬,源代碼層面進(jìn)行研究學(xué)習(xí)楼熄,同時(shí)分享出來(lái)我的經(jīng)驗(yàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窍仰,更是在濱河造成了極大的恐慌勿她,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衅枫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)致开,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萎馅,“玉大人双戳,你說(shuō)我怎么就攤上這事∶臃迹” “怎么了飒货?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵魄衅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我塘辅,道長(zhǎng)晃虫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任扣墩,我火速辦了婚禮哲银,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呻惕。我一直安慰自己荆责,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布亚脆。 她就那樣靜靜地躺著做院,像睡著了一般。 火紅的嫁衣襯著肌膚如雪濒持。 梳的紋絲不亂的頭發(fā)上山憨,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弥喉,去河邊找鬼郁竟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛由境,可吹牛的內(nèi)容都是我干的棚亩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虏杰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讥蟆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起纺阔,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘸彤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后笛钝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體质况,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年玻靡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了结榄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囤捻,死狀恐怖臼朗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤视哑,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布绣否,位于F島的核電站,受9級(jí)特大地震影響挡毅,放射性物質(zhì)發(fā)生泄漏蒜撮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一慷嗜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丹壕,春花似錦庆械、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至琉用,卻和暖如春堕绩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑时。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工奴紧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晶丘。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓黍氮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親浅浮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沫浆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 使用redux+react已有一段時(shí)間,剛開(kāi)始使用并未深入了解其源碼滚秩,最近靜下心細(xì)讀源碼专执,感觸頗深~ 本文主要包含...
  • 前言 Redux 架構(gòu)是 Flux 架構(gòu)的一個(gè)變形,相對(duì)于 Flux郁油,Redux 的復(fù)雜性相對(duì)較低本股,而且最為巧妙的...
    KenChoi閱讀 10,075評(píng)論 4 30
  • Redux簡(jiǎn)介 Redux從設(shè)計(jì)之初就不是為了編寫(xiě)最短、最快的代碼桐腌,他是為了解決 “當(dāng)有確定的狀態(tài)發(fā)生改變時(shí)痊末,數(shù)據(jù)...
    _花閱讀 413評(píng)論 0 1
  • 前言 在React中,數(shù)據(jù)流是單向的,并且是不可逆的,這其實(shí),也很好理解,之所以這么設(shè)計(jì),是因?yàn)榻M件復(fù)用的特點(diǎn) 父...
    itclanCoder閱讀 902評(píng)論 0 6
  • 昨晚看書(shū),讀到了一個(gè)很美好的心理學(xué)原則哩掺。 我拍下來(lái)發(fā)給朋友凿叠,她說(shuō),感覺(jué)一下子戳中。我說(shuō)我也覺(jué)得盒件。怎么說(shuō)呢蹬碧,它讓我們...
    柔光小Joan閱讀 407評(píng)論 0 0