React 项目引入 Dva

背景
现在手上在做的 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
准备
首先安装 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)并没有渲染,再看控制台发现报错了。
- 首先是这样一个警告信息:
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;
- 然后是一个路由问题的警告:
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导致的页面刷新失败的问题。 - 嵌套路由配置的问题。
参考资料

本文由博客一文多发平台 OpenWrite 发布!
React 项目引入 Dva的更多相关文章
- 【React】react项目引入echarts插件 K线图
参考npm文档:https://www.npmjs.com/package/echarts-for-react 由于npm上已经有针对react项目出的echarts插件,所以在这里直接安装 第一步: ...
- react 项目引入路由
下载路由包 npm i react-router-dom -d 前台路由 登陆: /login /login.jsx App.js import React ,{Component} from 're ...
- react项目引入使用element-react报错
解决办法 npm i react-hot-loader@next -D
- react项目中引入了redux后js控制路由跳转方案
如果你的项目中并没有用到redux,那本文你可以忽略 问题引入 纯粹的单页面react应用中,通过this.props.history.push('/list')就可以进行路由跳转,但是加上了redu ...
- 【已解决】React项目中按需引入ant-design报错TypeError: injectBabelPlugin is not a function
react项目中ant-design按需加载,使用react-app-rewired的时候报错 运行npm start或者yarn start报如下错误: TypeError: injectBabel ...
- DvaJS构建配置React项目与使用
DvaJS构建配置React项目与使用 一,介绍与需求分析 1.1,介绍 dva 首先是一个基于redux 和redux-saga的数据流方案,然后为了简化开发体验,dva 还额外内置了react-r ...
- 《Node+MongoDB+React 项目实战开发》已出版
前言 从深圳回长沙已经快4个月了,除了把车开熟练了外,并没有什么值得一提的,长沙这边要么就是连续下一个月雨,要么就是连续一个月高温暴晒,上班更是没啥子意思,长沙这边的公司和深圳落差挺大的,薪资也是断崖 ...
- 如何优雅地在React项目中使用Redux
前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...
- 手把手教你用webpack3搭建react项目(开发环境和生产环境)(一)
开发环境和生产环境整个配置源码在github上,源码地址:github-webpack-react 如果觉得有帮助,点个Star谢谢!! (一)是开发环境,(二)是生产环境. 一.首先创建packag ...
随机推荐
- 【Offer】[15] 【二进制中1的个数】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路分析 让整数和1相与,可以判断整数二进制表示中最右边一位是否为1, ...
- Storm 系列(六)—— Storm 项目三种打包方式对比分析
一.简介 在将 Storm Topology 提交到服务器集群运行时,需要先将项目进行打包.本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明.主要打包方式有以下三种: 第一种:不加任 ...
- redis之pipeline使用
redis之pipeline 我们要完成一个业务,可能会对redis做连续的多个操作,这有很多个步骤是需要依次连续执行的.这样的场景,网络传输的耗时将是限制redis处理量的主要瓶颈. 那么此时就可以 ...
- Linux安装yum install gcc-c++出错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos...
错误如图: 解决办法: 1.修改配置文件 /etc/resolv.conf,该配置文件如下: 2.输入:gedit resolv.conf,修改配置文件内容如下: 3.然后重启: 4.重新进行安装: ...
- linux中启动Zookeeper
1.先把zookeeper的安装包解压在/usr/local,如下: 2.进入zookeeper目录,创建一个data目录 3.进入同级conf目录下,里面有zoo_sample.cfg,修改该文件名 ...
- IntelliJ IDEA 设置 vue 支持
一.IntelliJ IDEA支持.vue文件 安装vue.js file --> settings --> plugins,输入vue,点击搜索结果里的vue.js右边的install按 ...
- Winform中使用ZedGraph实现曲线图中字体去掉边框
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- Metasploit工具----辅助模块
Metasploit框架(Metasploit Framework,MSF)是一个开源工具,旨在方便渗透测试,他是有Ruby程序语言编写的模板化框架,具有很好的扩展性,便于渗透测试人员开发.使用定制的 ...
- /bin/java: 没有那个文件或目录spark/bin/spark-class:行71: /usr/java/jdk1.8
1.检查java环境有没有问题 2.1没问题后检查文件的编码是否有问题
- Salesforce学习之路-admin篇(三)role hierarchy & sharing
1. Role Hierarchy 在私有或者混合模型中,如果在organization-wide defaults设置某个对象为Private,那么对象的记录只有拥有者可以查看.但是,role hi ...