您好,登錄后才能下訂單哦!
這篇文章主要介紹了react dva指的是什么,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
在react中,dva是一個(gè)基于redux和redux-saga的數(shù)據(jù)流方案,然后為了簡(jiǎn)化開(kāi)發(fā)體驗(yàn),dva還額外內(nèi)置了react-router和fetch,所以也可以理解為一個(gè)輕量級(jí)的應(yīng)用框架。
dva介紹
dva官網(wǎng)地址:https://dvajs.com/
dva是螞蟻金服推出的一個(gè)單頁(yè)應(yīng)用框架,對(duì)redux,react-router,redux-saga進(jìn)行了上層封裝。redux-saga是一個(gè)用于管理redux應(yīng)用異步操作的中間件,redux-saga通過(guò)創(chuàng)建sagas將所有異步操作邏輯收集在一個(gè)地方集中處理,可以用來(lái)代替redux-thunk中間件
這意味著應(yīng)用的邏輯會(huì)存在兩個(gè)地方
(1) reducer負(fù)責(zé)處理action的stage更新
(2) sagas負(fù)責(zé)協(xié)調(diào)那些復(fù)雜或者異步的操作
sagas是通過(guò)generator函數(shù)來(lái)創(chuàng)建的
sagas可以被看作是在后臺(tái)運(yùn)行的進(jìn)程。sagas監(jiān)聽(tīng)發(fā)起的action,然后決定基于這個(gè)action來(lái)做什么 (比如:是發(fā)起一個(gè)異步請(qǐng)求,還是發(fā)起其他的action到store,還是調(diào)用其他的sagas 等
因?yàn)槭褂昧薵enerator函數(shù),redux-saga讓你可以用 同步的方式來(lái)寫(xiě)異步代碼
React 項(xiàng)目引入 Dva
介紹
準(zhǔn)備
首先安裝 dva (目前版本 2.4.1)npm install dva —save
參考官方文檔,改造項(xiàng)目為 dva 模式,在 src 下新增或修改入口文件 index.js
import dva from ‘dva’; import createHistory from ‘history/createHashHistory’; //1.Initialize const app = dva({ history: createHistory(), }); //2.Plugins //app.use({}); //3.Model //app.model(require(‘./models/app’).default); //4.Router app.router(require(‘./router’).default); //5.Start app.start(‘#root’);
router.js
import React from ‘react’; import { Router, Route, Switch } from ‘dva/router’; import App from ‘./containers/App’; import{ Account, Articles, Channels, Editor } from ‘./containers’; const { ArticleList } = Articles; const RouterConfig = (({ history }) => ( <Routerhistory={history}> <Switch> <Route path=‘/‘ component={App}> <IndexRoute component={Account} /> <Route path=‘a(chǎn)ccount’ component={Account} exact /> <Route path=‘a(chǎn)rticles’ component={ArticleList exact /> <Route path=‘channels’ component={Channels} exact /> <Route path=‘editor’ component={Editor} exact /> </Route> </Switch> </Router> )); export default RouterConfig;
說(shuō)明:App 組件是整個(gè)頁(yè)面的容器組件,包含了 menu、header、footer 和一些公用部分,通過(guò)切換菜單匹配對(duì)應(yīng)路由,從而跳轉(zhuǎn)到各個(gè)子組件頁(yè)面,所以路由配置需要寫(xiě)成嵌套形式。
更多路由配置,參考 react-router 官方文檔。
到這里,一個(gè)最簡(jiǎn)單的 dva 模式已經(jīng)配置好了,只要在對(duì)應(yīng)組件里面設(shè)置 model、reducer 并在頁(yè)面中 connect ,就可以使用 dva 來(lái)管理狀態(tài)了。
問(wèn)題解決
配置完成后重新啟動(dòng)一下項(xiàng)目,查看頁(yè)面效果如下:
發(fā)現(xiàn)容器部分渲染成功,但是子路由對(duì)應(yīng)的頁(yè)面(默認(rèn)是 Account)并沒(méi)有渲染,再看控制臺(tái)發(fā)現(xiàn)報(bào)錯(cuò)了。
1、首先是這樣一個(gè)警告信息:
Warning: Please use `require(“history”).createHashHistory` instead of `require(“history/createHashHistory”)`. Support for the latter will be removed in the next major release.
在 dva 的 issure 里面查找到相同的問(wèn)題,按照提示改成下面的格式就可以了。
const createHistory = require(‘history’).createBrowserHistory;
2、然后是一個(gè)路由問(wèn)題的警告:
Warning: You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored
React-router 4.0 以上版本已經(jīng)不建議像下面這樣使用嵌套路由了
<Route path=‘/‘ component={App} > <Route path=‘a(chǎn)ccount’ component={Account} /> </Route>
對(duì)應(yīng)的,直接改成組件嵌套的形式(注意子路由的 path 要加上 /)就可以了。
<App> <Route path=‘/account’component={Account} /> </App>
改完之后然后重新,這兩個(gè)警告就沒(méi)有了。繼續(xù)看路由和渲染的問(wèn)題。
3、按理來(lái)說(shuō),進(jìn)入應(yīng)用默認(rèn)會(huì)顯示 Account 組件(因?yàn)榕渲昧?IndexRoute),而且當(dāng)修改文件刷新頁(yè)面時(shí)候,頁(yè)面直接報(bào)錯(cuò)了,如下:
由此猜想是頁(yè)面路由的配置出了問(wèn)題,查找了相關(guān)的資料(React填坑之react-router刷新后報(bào)錯(cuò)解決方法),發(fā)現(xiàn)原來(lái)是 dva 中使用 BrowserHistory 的問(wèn)題,所以直接把 BrowserHistory 改成 HashHistory
就可以了。
//const createHistory = require(‘history’).createBrowserHistory; const createHistory = require(‘history’).createHashHistory;
重新啟動(dòng)項(xiàng)目,嘗試切換路由,發(fā)現(xiàn)一切正常了。
后面就可以在頁(yè)面中進(jìn)行 dva 的改造了,dva 中 model 、reducer 的用法都比較簡(jiǎn)單,根據(jù)文檔進(jìn)行嘗試就可以了,這里便不一一敘述了。
總結(jié)一下項(xiàng)目引入 dva 遇到的幾個(gè)問(wèn)題。
import createHistory from ‘history/createHashHistory’;
寫(xiě)法帶來(lái) 的警告
使用 createHashHistory
導(dǎo)致的頁(yè)面刷新失敗的問(wèn)題。
嵌套路由配置的問(wèn)題。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享react dva指的是什么內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。