什么是react dva?


本文摘自PHP中文网,作者青灯夜游,侵删。

在react中,dva是一个基于redux和redux-saga的数据流方案,然后为了简化开发体验,dva还额外内置了react-router和fetch,所以也可以理解为一个轻量级的应用框架。

  • 该方法适用于所有品牌的电脑。

dva介绍

dva官网地址:https://dvajs.com/

dva是蚂蚁金服推出的一个单页应用框架,对redux,react-router,redux-saga进行了上层封装。redux-saga是一个用于管理redux应用异步操作的中间件,redux-saga通过创建sagas将所有异步操作逻辑收集在一个地方集中处理,可以用来代替redux-thunk中间件

  • 这意味着应用的逻辑会存在两个地方

    (1) reducer负责处理action的stage更新

    (2) sagas负责协调那些复杂或者异步的操作

  • sagas是通过generator函数来创建的

  • sagas可以被看作是在后台运行的进程。sagas监听发起的action,然后决定基于这个action来做什么 (比如:是发起一个异步请求,还是发起其他的action到store,还是调用其他的sagas 等

  • 因为使用了generator函数,redux-saga让你可以用 同步的方式来写异步代码

React 项目引入 Dva

介绍

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

准备

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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、首先是这样一个警告信息:

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

1

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

2、然后是一个路由问题的警告:

1

Warning: You should not use <Route component> and <Route children> in the same route; <Route children> will be ignored

React-router 4.0 以上版本已经不建议像下面这样使用嵌套路由了

1

2

3

<Route path=‘/‘ component={App} >

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

</Route>

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

1

2

3

<App>

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

</App>

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

3、按理来说,进入应用默认会显示 Account 组件(因为配置了 IndexRoute),而且当修改文件刷新页面时候,页面直接报错了,如下:
file

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

1

2

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

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

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

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

总结

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

  • import createHistory from ‘history/createHashHistory’; 写法带来 的警告

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

  • 嵌套路由配置的问题。

更多编程相关知识,请访问:编程入门!!

以上就是什么是react dva?的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

如何解决webstorm创建React失败问题

React组件拆分的重要性

React中怎么安装sass

React组件添加样式的方法

谷歌怎么安装React插件

React生命周期详解

React完成一个图片轮播组件

React中样式冲突怎么解决

值得了解的6大React组件文档化工具(推荐收藏)

React有哪些ui框架?

更多相关阅读请进入《React》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...