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