如今手上在作的 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 发布!