新人第006天---react&redux初識

公司的項目使用的是react+redux+antd的技術(shù),作為新手我在不斷學(xué)習(xí),整理一下react+redux的內(nèi)容尽纽,作為項目入門的記錄。

網(wǎng)上有很多有趣清晰的說明文章童漩,參考了幾篇列一下:

https://zhuanlan.zhihu.com/p/20641377?columnSlug=haochuan

https://github.com/jasonslyvia/a-cartoon-intro-to-redux-cn

http://www.ruanyifeng.com/blog/2015/03/react.html(阮大神的文章需要好好學(xué)習(xí)下的)

http://www.runoob.com/react/react-state.html?


下面是關(guān)于react和redux的學(xué)習(xí)內(nèi)容摘要

react:

特點(diǎn):

1.組件化——JSX語法弄贿;

2.單向數(shù)據(jù)流------數(shù)據(jù)一旦更新,就將重新渲染整個APP---redux矫膨;

3.虛擬DOM樹———更新時重建DOM樹差凹,找到與上一個版本的DOM差異,計算最新DOM更新操作侧馅,批量進(jìn)行更新----可以直接渲染特定的頁面而不是整個APP危尿;

React 把組件看成是一個狀態(tài)機(jī)(State Machines)。通過與用戶的交互馁痴,實現(xiàn)不同狀態(tài)谊娇,然后渲染 UI,讓用戶界面和數(shù)據(jù)保持一致罗晕。這個渲染過程為:交互—>狀態(tài)改變—>實現(xiàn)不同狀態(tài)—>渲染UI济欢。React 里赠堵,只需更新組件的 state,然后根據(jù)新的 state 重新渲染用戶界面(不要操作 DOM)法褥。

舉個例子茫叭。最近做的一個小需求,通過訂單的狀態(tài)更改訂單的類型列表半等,出了bug揍愁,后來在前輩指導(dǎo)下修正了。貼一部分代碼說明一下:

handleOrderTypeChange= (value) => {

? ? this.setState({orderType: value});

? ? this.props.form.setFieldsValue({order_status: orderTypeToStatus[value] 酱鸭?orderTypeToStatus[value][0] : orderStatus[0].name});

}

//在view中進(jìn)行更新

render{ ……

? ? {getFieldDecorator('order_type',{initialValue:"",onChange:this.handleOrderTypeChange}) ? ? ? ? ?(

? ? ? ? {this.orderOptions()}

? ? )}

}

這部分通過在函數(shù) handleOrderTypeChange 中吗垮,使用this.setState 方法修改狀態(tài)值垛吗,然后使用antd的方法 setFieldsValue凹髓,將ordertype的內(nèi)容推進(jìn)文本框即可。這個例子體現(xiàn)了react的組件化的特點(diǎn)怯屉。


redux:

從上述對react的特點(diǎn)介紹蔚舀,可以看出,

1. react的數(shù)據(jù)是單向流動的锨络,沒有數(shù)據(jù)向上回溯的能力赌躺,也就是說數(shù)據(jù)只能單向向下分發(fā),或者自行內(nèi)部消化羡儿。

2. react根本無法讓兩個組件相互交流礼患,互相使用數(shù)據(jù),然后這時候不通過DOM溝通(也就是React體制內(nèi))解決的唯一辦法就是提升state掠归,將state放到共有的父組件中來管理缅叠,再作為props分發(fā)回子組件。

3. 子組件改變父組件state的辦法只能是通過onClick觸發(fā)父組件聲明好的回調(diào)虏冻,也就是父組件提前聲明好函數(shù)或方法作為契約描述自己的state將如何變化肤粱,再將它同樣作為屬性交給子組件使用。

4. 為了面臨所有可能的擴(kuò)展問題厨相,最容易想到的辦法就是把所有state集中放到所有組件頂層领曼,然后分發(fā)給所有組件。

為了有更好的state管理蛮穿,就需要一個庫來作為更專業(yè)的頂層state分發(fā)給所有React應(yīng)用庶骄,這就是Redux。

讓我們回來看看重現(xiàn)上面結(jié)構(gòu)的需求:

a. 需要回調(diào)通知state (等同于回調(diào)參數(shù)) -> action

b. 需要根據(jù)回調(diào)處理 (等同于父級方法) -> reducer

c. 需要state (等同于總狀態(tài)) -> store


因此践磅,redux的三要素就是 action单刁,reducer,store:

action:純聲明式的數(shù)據(jù)結(jié)構(gòu)音诈,只提供事件的所有要素幻碱,不提供邏輯绎狭。

reducer:一個匹配函數(shù),action的發(fā)送是全局的:所有的reducer都可以捕捉到并匹配(比如使用switch...case結(jié)構(gòu))與自己相關(guān)與否褥傍,相關(guān)就拿走action中的要素進(jìn)行邏輯處理儡嘶,修改store中的狀態(tài),不相關(guān)就不對state做處理原樣返回恍风。

store:負(fù)責(zé)存儲狀態(tài)并可以被react api回調(diào)蹦狂,發(fā)布action.

具體工作的時候,流程為:

通過view(state)觸發(fā)action朋贬,通過reducer匹配action凯楔,通過在reducer中改變state,最終反應(yīng)到view中锦募;

流程圖為:

view ---> action ---> reducer ---> store(state) ---> view


當(dāng)然一般不會直接把兩個庫拿來用诊赊,還有一個binding叫react-redux, 提供一個Provider和connect民逼。

Provider是一個普通組件,可以作為頂層app的分發(fā)點(diǎn),它只需要store屬性就可以了四濒。它會將state分發(fā)給所有被connect的組件缭嫡,不管它在哪里痛侍,被嵌套多少層钥弯。

connect是真正的重點(diǎn),它是一個柯里化函數(shù)垂寥,意思是先接受兩個參數(shù)(數(shù)據(jù)綁定mapStateToProps和事件綁定mapDispatchToProps)颠黎,再接受一個參數(shù)(將要綁定的組件本身):

mapStateToProps:構(gòu)建好Redux系統(tǒng)的時候,它會被自動初始化滞项,但是你的React組件并不知道它的存在狭归,因此你需要分揀出你需要的Redux狀態(tài),所以你需要綁定一個函數(shù)蓖扑,它的參數(shù)是state唉铜,簡單返回你關(guān)心的幾個值。

mapDispatchToProps:聲明好的action作為回調(diào)律杠,也可以被注入到組件里潭流,就是通過這個函數(shù),它的參數(shù)是dispatch柜去,通過redux的輔助方法bindActionCreator綁定所有action以及參數(shù)的dispatch灰嫉,就可以作為屬性在組件里面作為函數(shù)簡單使用了,不需要手動dispatch嗓奢。這個mapDispatchToProps是可選的讼撒,如果不傳這個參數(shù)redux會簡單把dispatch作為屬性注入給組件,可以手動當(dāng)做store.dispatch使用。這也是為什么要科里化的原因根盒。


做好以上流程Redux和React就可以工作了钳幅。簡單地說就是:

1.頂層分發(fā)狀態(tài),讓React組件被動地渲染炎滞。

2.監(jiān)聽事件敢艰,事件有權(quán)利回到所有狀態(tài)頂層影響狀態(tài)。



最基礎(chǔ)的一點(diǎn)探索册赛,未完待續(xù)钠导。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末森瘪,一起剝皮案震驚了整個濱河市牡属,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扼睬,老刑警劉巖逮栅,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痰驱,居然都是意外死亡证芭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門担映,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叫潦,你說我怎么就攤上這事蝇完。” “怎么了矗蕊?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵短蜕,是天一觀的道長。 經(jīng)常有香客問我傻咖,道長朋魔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任卿操,我火速辦了婚禮警检,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘害淤。我一直安慰自己扇雕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布窥摄。 她就那樣靜靜地躺著镶奉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哨苛,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天鸽凶,我揣著相機(jī)與錄音,去河邊找鬼建峭。 笑死吱瘩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的迹缀。 我是一名探鬼主播使碾,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祝懂!你這毒婦竟也來了票摇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤砚蓬,失蹤者是張志新(化名)和其女友劉穎矢门,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灰蛙,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祟剔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了摩梧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片物延。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仅父,靈堂內(nèi)的尸體忽然破棺而出叛薯,到底是詐尸還是另有隱情,我是刑警寧澤笙纤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布耗溜,位于F島的核電站,受9級特大地震影響省容,放射性物質(zhì)發(fā)生泄漏抖拴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一腥椒、第九天 我趴在偏房一處隱蔽的房頂上張望阿宅。 院中可真熱鬧,春花似錦寞酿、人聲如沸家夺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拉馋。三九已至榨为,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煌茴,已是汗流浹背随闺。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔓腐,地道東北人矩乐。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像回论,于是被迫代替她去往敵國和親散罕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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