React 项目引入 Dva_白江_前端开发者

file

file

背景

现在手上在做的 React 项目因为年代久远,用的 Redux,写代码的体验不太好,所以想升级一下引入 dva。以往使用 dva 都是使用 dva-cli 直接生成 dva 项目,或者在使用 ant design pro 的时候使用 umi 直接生成 react + antd + dva 项目,省去了大量配置的成本。但是这些案例都是在项目初期的时候直接引入了 dva,而针对已有的 react 项目,想要升级到 dva,应该如何引入呢?引入 dva 的过程又会遇到哪些问题?花了半天时间升级到 dva,这里就讲升级过程中遇到的问题做个汇总。

Reduxdva-cliant design pro

介绍

  • 项目情况:nw.js + react + redux + antd (客户端应用)
  • 目标: redux -> dva
  • 项目情况:nw.js + react + redux + antd (客户端应用)
  • 目标: redux -> dva
  • 准备

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

    2. 参考官方文档,改造项目为 dva 模式,在 src 下新增或修改入口文件 index.js

  • 首先安装 dva (目前版本 2.4.1)
    npm install dva —save

  • 首先安装 dva (目前版本 2.4.1)
    npm install dva —save

    npm install dva —save

  • 参考官方文档,改造项目为 dva 模式,在 src 下新增或修改入口文件 index.js

  • 参考官方文档,改造项目为 dva 模式,在 src 下新增或修改入口文件 index.js

    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’);
    

    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
  • 然后在同级目录下添加路由文件 router.js
  • 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;
    

    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 官方文档

    react-router 官方文档

    到这里,一个最简单的 dva 模式已经配置好了,只要在对应组件里面设置 model、reducer 并在页面中 connect ,就可以使用 dva 来管理状态了。

    问题解决

    配置完成后重新启动一下项目,查看页面效果如下:
    file

    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.
    

    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 里面查找到相同的问题,按照提示改成下面的格式就可以了。

    issure

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

    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
    

    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>
    

    <Route path=‘/‘ component={App} >
    <Route path=‘account’ component={Account} />
    </Route>

    对应的,直接改成组件嵌套的形式(注意子路由的 path 要加上 /)就可以了。

    <App>
    	<Route path=‘/account’component={Account} />
    </App>
    

    <App>
    <Route path=‘/account’component={Account} />
    </App>

    改完之后然后重新,这两个警告就没有了。继续看路由和渲染的问题。
    3. 按理来说,进入应用默认会显示 Account 组件(因为配置了 IndexRoute),而且当修改文件刷新页面时候,页面直接报错了,如下:
    file

    IndexRoute
    file

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

    React填坑之react-router刷新后报错解决方法BrowserHistoryHashHistory

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

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

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

    file

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

    总结

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

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

  • 使用 createHashHistory 导致的页面刷新失败的问题。
  • createHashHistory

  • 嵌套路由配置的问题。
  • 参考资料

    1. 基于create-react-app官方脚手架搭建dva模式的项目(一)
    2. React-Router 中文文档
    3. DvaJS 文档
  • 基于create-react-app官方脚手架搭建dva模式的项目(一)
  • 基于create-react-app官方脚手架搭建dva模式的项目(一)

  • React-Router 中文文档
  • React-Router 中文文档

  • DvaJS 文档
  • DvaJS 文档

    file

    file

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

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

    OpenWrite

    » 本文来自:前端开发者 » 《React 项目引入 Dva_白江_前端开发者》
    » 本文链接地址:https://www.rokub.com/73671.html
    » 您也可以订阅本站:https://www.rokub.com
    赞(0)
    64K

    评论 抢沙发

    评论前必须登录!