dva 中页面过渡效果封装的很好,下面介绍常用的两个 js 库。

之前对 dva-loading 理解存在误区,认为只要在 index.js 中配置一下就没事了,事实上 dva-loading 只是提供当前异步加载方法的状态(异步加载中状态为 true,异步加载完成状态为 false),对应加载样式由各自组件自己控制,如:Antd 中 Table 组件自身的 loading 属性。并添加完整流程示例代码。

一、过渡组件 dva-loading

传统做法

比如请求一个用户页面,刚进去的时候由于要去服务器请求数据需要花费时间,这段时间页面应该是不能点击的状态。

如果不使用这个组件,传统做法是写个蒙版组件,提供两个方法 start() 和 end(),当进行 ajax 请求开始时调用 start() 方法给整个页面加上一层蒙版,此时不能进行操作,在请求结束也就是 ajax 的 success 回调函数中调用 end() 方法关闭蒙版,表明数据已经请求到了,可以操作页面。

作用

该组件仅仅监听异步加载状态,这从它的调用方式就可以看出来 const isLoading = loading.effects['user/query'],其中 user/query 是 model 中的异步请求方法。

loading 在异步请求发出那一刻会持续监听该异步请求方法的状态,在异步请求结束之前 isLoading 的值一直是 true,当此次异步请求结束时 isLoading 的值变成 false,同时 loading 对象停止监听。

配置

dva 项目的 index.js 文件:

import createLoading from 'dva-loading';

const app = dva();

app.use(createLoading());

配置完成后,在任何一个 dva 的 routes 组件中就都会有一个 loading 对象,如果你对 dva 稍有了解的话,应该不难知道它在哪。比如下面这行代码中的 loading 对象就是由于上面的配置。

export default connect(({ app, loading }) => ({ app, loading }))(App);

打印一下 loading 对象,可看到内容如下:

loading: {
global: false,
models: {app: false},
effects: {app: false}
}

loading 有三个方法,其中 loading.effects['user/query'] 为监听单一异步请求状态,当页面处于异步加载状态时该值为 true,当页面加载完成时,自动监听该值为 false。

如果同时发出若干个异步请求,需求是当所有异步请求都响应才做下一步操作,可以使用 loading.global() 方法,该方法监听所有异步请求的状态。

怎么用?

使用 Antd 的 Table 组件 时,查阅 API 可以看到有个 loading 的属性。如果该属性值为 true,Table 组件自身会显示加载效果,该值为 false,加载效果消失。可以通过 loading 对象判断当前是否有异步加载。具体示例代码如下:

// src > models >user.js
export default {
namespace: 'user',
state: {
userList: [], // 存放用户列表
},
effects: {
* query ({ payload = {} }, { call, put }) {
// 获取用户列表,赋值给 userList
// 使用 axios 或者 ajax 请求后台返回数据
const result = axios.request('xxx/xxx');
// 调用 reducers 中的 updateState 方法改变 state 中 userList 的值
yield put({ type: 'updateState', payload: { userList: result.data });
}
},
reducers: {
updateState (state, { payload }) {
return { ...state, ...payload };
},
},
} // src > routes > user.js
import React from 'react';
import { connect } from 'dva';
import { Table } from 'antd'; const User = ({ dispatch, user, loading }) => {
/**
根据 loading.effects 对象判断当前异步加载是否完成,并将该值传递给 Table 组件的 loading 属性,
Table 组件会自己控制加载样式。dva-loading 在这里的作用只是提供异步加载的状态,
具体加载样式由对应组件自己提供。
*/
const isLoading = loading.effects['user/query']
const { userList } = user return (
<Table
dataSource={userList}
loading={isLoading}
rowKey={record => record.id}
/>
);
} export default connect(({ user, loading }) => ({ user, loading }))(User);

注:如果还有疑问,可下方留言。

二、动画组件 nprogress

安装

$ npm install nprogress 

作用

制作页面加载时动态页面,在页面顶端提供动态进度条,表明当前页面正在加载状态。

 
nprogress

用法

xx.js 中

import NProgress from 'nprogress';

提供了两个方法:NProgress.start() 和 NProgress.done()。

在刚开始请求(可以认为是 ajax 请求)页面数据时调用 NProgress.start() 方法,此时页面顶端会有蓝色动态进度条;在页面请求数据完毕时(可以认为是 ajax 的 success 回调函数),调用 NProgress.done() 方法,此时蓝色进度条会瞬间加载 100% 然后消失。

三、dva-loading 和 nprogress 配合使用

index.js 中注册 dva-loading 插件。

import createLoading from 'dva-loading';

const app = dva();

app.use(createLoading());

app.js 组件中使用。

import React from 'react';
import { connect } from 'dva';
import NProgress from 'nprogress'; const App= ({ app, loading }) => { let currHref = '';
const href = window.location.href; // 浏览器地址栏中地址
if (currHref !== href) { // currHref 和 href 不一致时说明进行了页面跳转
NProgress.start(); // 页面开始加载时调用 start 方法
if (!loading.global) { // loading.global 为 false 时表示加载完毕
NProgress.done(); // 页面请求完毕时调用 done 方法
currHref = href; // 将新页面的 href 值赋值给 currHref
}
} } export default withRouter(connect(({ app, loading }) => ({ app, loading }))(App));

dva-loading 实践用法的更多相关文章

  1. npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)

    什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...

  2. dva的基本用法

    dva是一个状态管理工具,整合了redux,redux-saga,react-router,fetch等框架,目前只能用于react的状态管理 1. dva的models dva的主要作用还是整合了r ...

  3. 【dva】dva的基本用法

    services 该文件夹用于存储services,里面的内容为接口调用函数,记得将数据返回.(request是我自己封装函数,也可以用axios原生的函数) const finishTask = { ...

  4. echarts实践用法

    在折线图中,当点击某个节点,出现提示浮框,并且可以进行点击操作 echarts 配置 tooltip: { show: true, formatter: function(e) { return 'a ...

  5. dva.js 用法总结

    dva.js是阿里前端团队开发的一个基于react.redux.webpack的一个前端框架,他能够实现react-redux-webpack环境一键部署,能帮前端工程师节省不少环境搭建的时间.而且经 ...

  6. golang channel 用法转的

    一.Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论.但就像John Gra ...

  7. Golang channel 用法简介

    channel 是 golang 里相当有趣的一个功能,大部分时候 channel 都是和 goroutine 一起配合使用.本文主要介绍 channel 的一些有趣的用法. 通道(channel), ...

  8. React + Dva + Antd + Umi 概况

    Dva 由阿里架构师 sorrycc 带领 team 完成的一套前端框架,在作者的 github 里是这么描述它的:"dva 是 react 和 redux 的最佳实践". Ant ...

  9. Golang Channel用法简编

    转自:http://tonybai.com/2014/09/29/a-channel-compendium-for-golang/ 在进入正式内容前,我这里先顺便转发一则消息,那就是Golang 1. ...

随机推荐

  1. 解释为什么不能依赖fail-fast

    我的观点fail-fast是什么就不多解释了,应该注意到的是(以ArrayList为例):modCount位于AbstractList中, protected transient int modCou ...

  2. css3 动画 示例

    /* animation */ .a-bounce,.a-flip,.a-flash,.a-shake,.a-swing,.a-wobble,.a-ring{-webkit-animation:1s ...

  3. 底层解析web安全软件

    试用了一些 web安全软件,服务器安全狗.云锁.绿盟……  感觉里面有些功能是可以手动优化的,大概总结一下. 1.禁止 ping                  这是服务器比较常用的功能,防止pin ...

  4. VMware 克隆 CentOS 后网卡信息修改

    概述 在我们需要多台 CentOS 虚拟机的时候,对已有虚拟机的系统进行克隆或是复制.但是这样做又有一个问题,克隆出来的虚拟机启动的时候你输入命令:ifconfig,eth0 网卡信息没了,只有一个 ...

  5. [Redis-CentOS7]Redis发布订阅操作(七)

    发布订阅 发布:打电话 订阅:接电话 订阅频道 127.0.0.1:6379> SUBSCRIBE msg Reading messages... (press Ctrl-C to quit) ...

  6. java开发规范学习

    from 慕课网-明明如月-<阿里巴巴的Java开发手册> Integer缓存问题分析 1, Integer缓存[-128, 127]的数字,除此之外,将通过new创建. Long也是缓存 ...

  7. codewars--js--Pete, the baker

    问题描述: Pete likes to bake some cakes. He has some recipes and ingredients. Unfortunately he is not go ...

  8. Flume 自定义拦截器 多行读取日志+截断

    前言: Flume百度定义如下: Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,F ...

  9. [红日安全]Web安全Day1 - SQL注入实战攻防

    本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...

  10. 软件测试常见术语(英->汉)收藏好随时备用!

    Defect 缺陷Defect Rate 缺陷率Verification & Validation 验证和确认Failure 故障White-box Testing 白盒测试Black-box ...