Dva快速入門间学,5分鐘入門10分鐘精通

dva 是一個(gè)基于 redux 和 redux-saga 的數(shù)據(jù)流方案,為了簡(jiǎn)化開發(fā)體驗(yàn)印荔,dva 還額外內(nèi)置了 react-router 和 fetch低葫,所以也可以理解為一個(gè)輕量級(jí)的應(yīng)用框架。

目前最流行的社區(qū) React 應(yīng)用架構(gòu)方案如下

1.路由:React-Router

2.架構(gòu):Redux

3.異步操作:Redux-saga

缺點(diǎn):要引入多個(gè)庫(kù)仍律,項(xiàng)目結(jié)構(gòu)復(fù)雜嘿悬。

dva 是將上面三個(gè) React 工具庫(kù)包裝在一起,簡(jiǎn)化了 API水泉,讓開發(fā) React 應(yīng)用更加方便和快捷善涨。

dva = React-Router + Redux + Redux-saga


一.Dva解決了React 沒(méi)有解決的問(wèn)題

React 本身只是一個(gè) DOM 的抽象層主到,使用組件構(gòu)建虛擬 DOM。

如果開發(fā)大應(yīng)用躯概,還需要解決2個(gè)問(wèn)題登钥。

·通信:組件之間如何通信

·數(shù)據(jù)流:數(shù)據(jù)如何和視圖如何串聯(lián)起來(lái)?路由和數(shù)據(jù)如何綁定娶靡?

1.通信問(wèn)題

組件會(huì)發(fā)生三種通信

(1)向子組件發(fā)消息

(2)向父組件發(fā)消息

(3)向其他組件發(fā)消息

React 只提供了一種通信手段:傳參牧牢。對(duì)于大應(yīng)用來(lái)說(shuō)很不方便。

react組件傳參示例

react本身的傳參是子組件通過(guò)父組件傳入的函數(shù)姿锭,將自己的值再傳回父組件塔鳍。

2.數(shù)據(jù)流向:


數(shù)據(jù)的改變發(fā)生通常是通過(guò)用戶交互行為或者瀏覽器行為(如路由跳轉(zhuǎn)等)觸發(fā)的,當(dāng)此類行為會(huì)改變數(shù)據(jù)的時(shí)候可以通過(guò)?dispatch?發(fā)起一個(gè) action呻此,如果是同步行為會(huì)直接通過(guò)?Reducers?改變?State?轮纫,如果是異步行為會(huì)先觸發(fā)?Effects?然后流向?Reducers?最終改變?State。

二.dva僅有6個(gè)api焚鲜,對(duì)redux用戶尤其友好

// 1.創(chuàng)建應(yīng)用

const app = dva();

// 2.注冊(cè)插件

app.use(createLoading());

// 3.注冊(cè)model

app.model(model);

// 4.取消model注冊(cè)掌唾,清理reducers,effects和subscriptions

app.unmodel(namespace)

// 5.注冊(cè)路由

app.router(()=> );

// 6.啟動(dòng)應(yīng)用

app.start('#root');

在這6步當(dāng)中,dva完成了使用React解決view層忿磅、redux管理model糯彬、saga解決異步的主要功能。

三.Model

Model 是 dva 最重要的部分葱她,所有的應(yīng)用邏輯都定義在它上面撩扒,可以理解為 redux、react-redux吨些、redux-saga 的封裝搓谆。通常項(xiàng)目中一個(gè)模塊對(duì)應(yīng)一個(gè) model。

model對(duì)象的例子

Model對(duì)象的屬性:

1.namespace

是該 Model 的命名空間豪墅,只能用字符串泉手,不支持通過(guò)?.?的方式創(chuàng)建多層命名空間。

2.state:

該 Model 當(dāng)前的數(shù)據(jù)狀態(tài)但校,直接決定了視圖層的輸出螃诅。

3.reducers:

Action處理器啡氢,處理同步操作状囱,可以看做是state的計(jì)算器,類似于redux中的reducer倘是,用來(lái)算出最新的state亭枷,是唯一可以修改state的地方,由action觸發(fā)搀崭,它有state和action兩個(gè)參數(shù)叨粘。

4.effects

Action處理器猾编,處理異步動(dòng)作,基于Redux-saga實(shí)現(xiàn)升敲。

內(nèi)部使用 yield 關(guān)鍵字答倡,標(biāo)識(shí)每一步的操作(不管是異步或同步)。

不能直接修改state驴党,由action觸發(fā)瘪撇,也可觸發(fā)action。

有action和effects兩個(gè)參數(shù)港庄,effects包含put倔既、call和select三個(gè)字段,put用于觸發(fā)action鹏氧,類似于dispatch渤涌,call用于調(diào)用異步處理邏輯,select用于從state中獲取數(shù)據(jù)把还。

5.subscriptions

用于訂閱一個(gè)數(shù)據(jù)源实蓬,然后根據(jù)需要 dispatch 相應(yīng)的 action。

相當(dāng)于一個(gè)監(jiān)聽(tīng)器吊履,可以監(jiān)聽(tīng)路由變化瞳秽,鼠標(biāo),鍵盤變化率翅,服務(wù)器連接變化练俐,狀態(tài)變化等,這樣就可以根據(jù)不同變化做相應(yīng)的處理冕臭,在這個(gè)subsription中的方法名是隨意定的腺晾,每次變化都會(huì)去調(diào)用里面的所有方法,所以需要加相應(yīng)的判斷辜贵。

subscriptions: {

? setup({dispatch,history }){?

? ? window.onresize =()=> {? ?

????????//當(dāng)瀏覽器的頁(yè)面的大小變化時(shí)觸發(fā)里面的dispatch方法

? ? ?????dispatch(type:? "save")

? ? }

? },

? onClick({dispatch }){

? ? document.addEventListener('click',()=> {

????????//當(dāng)鼠標(biāo)點(diǎn)擊時(shí)觸發(fā)里面的dispatch方法

? ? ?????dispatch(type: "save")

? ? })

? }

}

四.connect方法

寫完model和組件后悯蝉,需要將model和組件連接起來(lái)。dva提供了connect方法托慨,connect是一個(gè)函數(shù)鼻由,綁定State到View。connect后的組件可以獲取到dispatch和state厚棵。

import { connect } from "dva";?

class Counter extends Component {

? ? constructor(props){

? ? ? ? super(props)

? ? }?

? ? render(){

? ? ? ? return?<div>{this.props.example.initText}</div>

? ? }

}

const mapStateToProps =(state)=>{

? ? //這里的example表示后面用this.props.example獲取state(根節(jié)點(diǎn))中exmpale命名空間中的state所有的數(shù)據(jù)

? ? return {

? ? ? ? example:state.example,

? ? }

}

//把model層的數(shù)據(jù)傳遞到當(dāng)前組件

export default connect(mapStateToProps)(Counter)?

五.dispatch方法

dispatch是一個(gè)函數(shù)方法蕉世,用來(lái)將Action發(fā)送到Model。

dispatch({

? type: 'click-submit-button',

? payload: this.form.data

})

被connect的Component會(huì)自動(dòng)在props中擁有dispatch方法婆硬。

六.異步請(qǐng)求

dva集成了isomorphic-fetch用于處理異步請(qǐng)求狠轻,并且使用dva-cli初始化的項(xiàng)目中,已經(jīng)在./src/utils/request.js中對(duì)fetch進(jìn)行了簡(jiǎn)單的封裝彬犯,可以在這里根據(jù)服務(wù)端API的數(shù)據(jù)結(jié)構(gòu)進(jìn)行統(tǒng)一的錯(cuò)誤處理向楼。

最后千萬(wàn)注意:effects和reducers中的方法不能同名查吊,否則會(huì)產(chǎn)生死循環(huán)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市湖蜕,隨后出現(xiàn)的幾起案子逻卖,更是在濱河造成了極大的恐慌,老刑警劉巖昭抒,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭阶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡戈鲁,警方通過(guò)查閱死者的電腦和手機(jī)仇参,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)婆殿,“玉大人诈乒,你說(shuō)我怎么就攤上這事∑怕” “怎么了怕磨?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)消约。 經(jīng)常有香客問(wèn)我肠鲫,道長(zhǎng),這世上最難降的妖魔是什么或粮? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任导饲,我火速辦了婚禮,結(jié)果婚禮上氯材,老公的妹妹穿的比我還像新娘渣锦。我一直安慰自己,他們只是感情好氢哮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布袋毙。 她就那樣靜靜地躺著,像睡著了一般冗尤。 火紅的嫁衣襯著肌膚如雪听盖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天裂七,我揣著相機(jī)與錄音皆看,去河邊找鬼。 笑死碍讯,一個(gè)胖子當(dāng)著我的面吹牛悬蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捉兴,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝎困,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了倍啥?” 一聲冷哼從身側(cè)響起禾乘,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虽缕,沒(méi)想到半個(gè)月后始藕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氮趋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年伍派,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剩胁。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诉植,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昵观,到底是詐尸還是另有隱情晾腔,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布啊犬,位于F島的核電站灼擂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏觉至。R本人自食惡果不足惜剔应,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望语御。 院中可真熱鬧领斥,春花似錦、人聲如沸沃暗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)孽锥。三九已至嚼黔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惜辑,已是汗流浹背唬涧。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盛撑,地道東北人碎节。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抵卫,于是被迫代替她去往敵國(guó)和親狮荔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胎撇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354