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 判断指定字符串是否为有效数字
May 11 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
Oct 11 Javascript
js实现倒计时(距离结束还有)示例代码
Jul 24 Javascript
javascript实现单击和双击并存的方法
Dec 13 Javascript
Javascript核心读书有感之词法结构
Feb 01 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
Vue不能检测到Object/Array更新的情况的解决
Jun 26 Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
对angularJs中ng-style动态改变样式的实例讲解
Sep 30 Javascript
VUE 自定义组件模板的方法详解
Aug 30 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
javascript引导程序
2008/10/26 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
谈谈vue中mixin的一点理解
2017/12/12 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
董事长助理工作职责
2014/06/08 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
九年级英语教学反思
2016/02/15 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python