DVA框架统一处理所有页面的loading状态


Posted in Javascript onAugust 25, 2017

dva 有一个管理 effects 执行的 hook,并基于此封装了 dva-loading 插件。通过这个插件,我们可以不必一遍遍地写 showLoading hideLoading,当发起请求时,插件会自动设置数据里的 loading 状态为 true 或 false 。然后我们在渲染 components 时绑定并根据这个数据进行渲染。

dva-loading的使用非常简单,在index.js中加入:

// 2. Plugins
app.use(createLoading());

每个页面中将loading状态作为属性传入组件,在进行样式处理,比如转圈圈或者显示正在加载什么的,但是重点是,我们的app有多个页面,每个页面都这么做,很繁琐。

如何只做一次状态处理,每次请求期间都会触发loading状态呢,其实也很简单啦,因为dva-loading提供了一个global属性。

1、state中的loading对象

DVA框架统一处理所有页面的loading状态

loading对象中的global属性表示的全局loading状态,models里是每个model的loading状态

所以我们根据state.loading.global指示全局loading状态。

2、一个父级组件

我们要向所有页面应用这个loading状态,那么我们可以在每个页面中使用一个父级组件来处理这个loading。上代码:

import React from 'react';
import styles from './app.css';
import { connect } from 'dva';
import { ActivityIndicator } from 'antd-mobile';
const TIMER = 800;
let timeoutId = null;
class App extends React.Component {
 state = {
  show: false
 }
 componentWillMount() {
  const { loading } = this.props;
  if (loading) {
   timeoutId = setTimeout(() => {
    this.setState({
     show: true
    });
   }, TIMER);
  }
 }
 componentWillReceiveProps(nextProps) {
  const { loading } = nextProps;
  const { show } = this.state;
  this.setState({
   show: false
  });
  if (loading) {
   timeoutId = setTimeout(() => {
    this.setState({
     show: true
    });
   }, TIMER);
  }
 }
 componentWillUnmount() {
  if (timeoutId) {
   clearTimeout(timeoutId);
  }
 }
 render() {
  const { loading } = this.props;
  const { show } = this.state;
  return (
   <div className={this.props.className}>
    { this.props.children }
    <div className={styles.loading}>
     <ActivityIndicator toast text="正在加载" animating={show && loading} />
    </div>
   </div>
  );
 }
}
const mapStateToProps = (state, ownProps) => {
 return {
  loading: state.loading.global && !state.loading.models.Verify
 }
};
export default connect(mapStateToProps)(App);

说明:

1、<ActivityIndicator />是ant-design mobile的一个loading指示组件,animating属性指示显示与否,我们使用show和loading两个属性来控制显示与否。

2、为什么要show和loading两个参数,有个loading不就可以了吗?show的存在是为了实现一个需求:loading在请求发生的TIMER时间后出现,如果请求很快,小于TIMER时间,那么就不显示loading。如果没有这个需求,这个组件中可以只保留render()方法。

3、&& !state.loading.models.Verify这个是做什么的?这个的作用是排除Verify这个model对loading的影响,比如我不想在这个model对应的页面出现loading,可以在这里处理。

3、在router.js中使用这个父级组件

有了这个父级组件,那么在每个页面中加入这个父级组件,就可以实现loading,当然这个是可以在router.js中统一处理一下的。

比如:

<Router history={history}>
   <Route path="/admin" component={App}>
    <IndexRoute component={AdminIndex} />
    <Route path="movie_add" component={MovieAdd} />
    <Route path="movie_list" component={MovieList} />
    <Route path="category_add" component={CategoryAdd} />
    <Route path="category_list" component={CategoryList} />
    <Route path="user_add" component={UserAdd} />
    <Route path="user_list" component={UserList} />
   </Route>
  </Router>

这样,在进入/admin下的每个页面,都会加载App作为父组件。

总结

以上所述是小编给大家介绍的DVA框架统一处理所有页面的loading状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript判断两种格式的输入日期的正确性的代码
Mar 25 Javascript
IE Firefox 使用自定义标签的区别
Oct 15 Javascript
JQuery 选择器、过滤器介绍
Feb 14 Javascript
js 字符串转化成数字的代码
Jun 29 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
Bootstrap精简教程
Nov 27 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
Sep 19 Javascript
JS简单实现移动端日历功能示例
Dec 28 Javascript
jQuery滚动监听实现商城楼梯式导航效果
Mar 06 Javascript
JS和canvas实现俄罗斯方块
Mar 14 Javascript
AngularJS实现的回到顶部指令功能实例
May 17 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 #Javascript
js求数组中全部数字可拼接出的最大整数示例代码
Aug 25 #Javascript
Vue.js进行查询操作的实例详解
Aug 25 #Javascript
Vue实例中生命周期created和mounted的区别详解
Aug 25 #Javascript
Vue.js框架路由使用方法实例详解
Aug 25 #Javascript
关于Vue.nextTick()的正确使用方法浅析
Aug 25 #Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 #jQuery
You might like
长波知识介绍
2021/03/01 无线电
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
浏览器加载、渲染和解析过程黑箱简析
2012/11/29 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
python获取远程图片大小和尺寸的方法
2015/03/26 Python
Python将列表数据写入文件(txt, csv,excel)
2019/04/03 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
Django中使用Celery的方法步骤
2020/12/07 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
2014年国庆节演讲稿
2014/09/02 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
小英雄雨来观后感
2015/06/09 职场文书
公司保洁员管理制度
2015/08/04 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers