欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

React 项目引入 Dva

程序员文章站 2022-03-07 10:13:12
背景 现在手上在做的 React 项目因为年代久远,用的 "Redux" ,写代码的体验不太好,所以想升级一下引入 dva。以往使用 dva 都是使用 "dva cli" 直接生成 dva 项目,或者在使用 "ant design pro" 的时候使用 umi 直接生成 react + antd + ......

React 项目引入 Dva

背景

现在手上在做的 react 项目因为年代久远,用的 redux,写代码的体验不太好,所以想升级一下引入 dva。以往使用 dva 都是使用 直接生成 dva 项目,或者在使用 的时候使用 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 来管理状态了。

问题解决

配置完成后重新启动一下项目,查看页面效果如下:
React 项目引入 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 的 里面查找到相同的问题,按照提示改成下面的格式就可以了。

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>

改完之后然后重新,这两个警告就没有了。继续看路由和渲染的问题。

  1. 按理来说,进入应用默认会显示 account 组件(因为配置了 indexroute),而且当修改文件刷新页面时候,页面直接报错了,如下:
    React 项目引入 Dva

由此猜想是页面路由的配置出了问题,查找了相关的资料(react填坑之react-router刷新后报错解决方法),发现原来是 dva 中使用 browserhistory 的问题,所以直接把 browserhistory 改成 hashhistory
就可以了。

//const createhistory = require(‘history’).createbrowserhistory;
const createhistory = require(‘history’).createhashhistory;

重新启动项目,尝试切换路由,发现一切正常了。
React 项目引入 Dva

后面就可以在页面中进行 dva 的改造了,dva 中 model 、reducer 的用法都比较简单,根据文档进行尝试就可以了,这里便不一一叙述了。

总结

总结一下项目引入 dva 遇到的几个问题。

  1. import createhistory from ‘history/createhashhistory’; 写法带来 的警告
  2. 使用 createhashhistory 导致的页面刷新失败的问题。
  3. 嵌套路由配置的问题。

参考资料

  1. react-router 中文文档
  2. dvajs 文档

React 项目引入 Dva

本文由博客一文多发平台 openwrite 发布!