如今手上在作的 React 項目由於年代久遠,用的 Redux,寫代碼的體驗不太好,因此想升級一下引入 dva。以往使用 dva 都是使用 dva-cli 直接生成 dva 項目,或者在使用 ant design pro 的時候使用 umi 直接生成 react + antd + dva 項目,省去了大量配置的成本。可是這些案例都是在項目初期的時候直接引入了 dva,而針對已有的 react 項目,想要升級到 dva,應該如何引入呢?引入 dva 的過程又會遇到哪些問題?花了半天時間升級到 dva,這裏就講升級過程當中遇到的問題作個彙總。html
npm install dva —save
react
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 官方文檔。git
到這裏,一個最簡單的 dva 模式已經配置好了,只要在對應組件裏面設置 model、reducer 並在頁面中 connect ,就可使用 dva 來管理狀態了。github
配置完成後從新啓動一下項目,查看頁面效果以下:
npm
發現容器部分渲染成功,可是子路由對應的頁面(默認是 Account)並無渲染,再看控制檯發現報錯了。redux
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 裏面查找到相同的問題,按照提示改爲下面的格式就能夠了。segmentfault
const createHistory = require(‘history’).createBrowserHistory;
Warning: You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored
React-router 4.0 以上版本已經不建議像下面這樣使用嵌套路由了antd
<Route path=‘/‘ component={App} > <Route path=‘account’ component={Account} /> </Route>
對應的,直接改爲組件嵌套的形式(注意子路由的 path 要加上 /)就能夠了。react-router
<App> <Route path=‘/account’component={Account} /> </App>
改完以後而後從新,這兩個警告就沒有了。繼續看路由和渲染的問題。app
由此猜測是頁面路由的配置出了問題,查找了相關的資料(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
致使的頁面刷新失敗的問題。
本文由博客一文多發平臺 OpenWrite 發佈!