React 項目引入 Dva


file

背景

現在手上在做的 React 項目因為年代久遠,用的 Redux,寫代碼的體驗不太好,所以想升級一下引入 dva。以往使用 dva 都是使用 dva-cli 直接生成 dva 項目,或者在使用 ant design pro 的時候使用 umi 直接生成 react + antd + dva 項目,省去了大量配置的成本。但是這些案例都是在項目初期的時候直接引入了 dva,而針對已有的 react 項目,想要升級到 dva,應該如何引入呢?引入 dva 的過程又會遇到哪些問題?花了半天時間升級到 dva,這里就講升級過程中遇到的問題做個匯總。

介紹

  • 項目情況:nw.js + react + redux + antd (客戶端應用)
  • 目標: redux -> dva

准備

  1. 首先安裝 dva (目前版本 2.4.1)
    npm install dva —save

  2. 參考官方文檔,改造項目為 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’);
  1. 然后在同級目錄下添加路由文件 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 來管理狀態了。

問題解決

配置完成后重新啟動一下項目,查看頁面效果如下:
file

發現容器部分渲染成功,但是子路由對應的頁面(默認是 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;
  1. 然后是一個路由問題的警告:
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),而且當修改文件刷新頁面時候,頁面直接報錯了,如下:
file

由此猜想是頁面路由的配置出了問題,查找了相關的資料(React填坑之react-router刷新后報錯解決方法),發現原來是 dva 中使用 BrowserHistory 的問題,所以直接把 BrowserHistory 改成 HashHistory
就可以了。

//const createHistory = require(‘history’).createBrowserHistory;
const createHistory = require(‘history’).createHashHistory;

重新啟動項目,嘗試切換路由,發現一切正常了。
file

后面就可以在頁面中進行 dva 的改造了,dva 中 model 、reducer 的用法都比較簡單,根據文檔進行嘗試就可以了,這里便不一一敘述了。

總結

總結一下項目引入 dva 遇到的幾個問題。

  1. import createHistory from ‘history/createHashHistory’; 寫法帶來 的警告
  2. 使用 createHashHistory 導致的頁面刷新失敗的問題。
  3. 嵌套路由配置的問題。

參考資料

  1. 基於create-react-app官方腳手架搭建dva模式的項目(一)
  2. React-Router 中文文檔
  3. DvaJS 文檔

file

本文由博客一文多發平台 OpenWrite 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM