dva-loading

摘要:
loading在异步请求发出那一刻会持续监听该异步请求方法的状态,在异步请求结束之前isLoading的值一直是true,当此次异步请求结束时isLoading的值变成false,同时loading对象停止监听。比如下面这行代码中的loading对象就是由于上面的配置。可以通过loading对象判断当前是否有异步加载。dva-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);
作者:dkvirus
链接:https://www.jianshu.com/p/61fe7a57fad4

免责声明:文章转载自《dva-loading》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇golang--解决邮件发送标题乱码问题[C]x字符转义序列下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF 客户端浏览器 添加Loading加载进度

在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的。 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等。 因此需要一个加载进度/加载失败的显示界面。 加载进度显示 界面显示 1. 界面显示,加载进度样式可参考: 绕圈进度条 2. 添加Loading状态枚举。不加载/加...

那些H5用到的技术(1)——素材加载

编码环境前言什么时候用到素材加载?loading提示,让用户等待图片的加载音频的加载利用神器PreloadJS总结 编码环境 Sublime Text 3 插件包括: Autoprefixer 自动补全CSS ColorPicker 颜色选择器 ConvertToUTF8 转码 GBK Support 支持GBK HTML-CSS-JS Pre...

JS 实现加载中转圈效果

以下3步走实现加载中,来源网络…… 1.添加CSS 加载中转圈CSS #loading { margin: auto; margin-top: 10px; display: block; 100px; height: 100px;...

bootstrap-实现loading效果

可以使用bootstrap的模态框(modal.js),使用它我们可以做出loading效果。  html <!-- loading --> <div class="modal fade" id="loading" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" da...

如何实现table表格中的button按钮有加载中的效果

一、如何实现table表格中的button按钮有加载中的效果 效果:  前端代码: <el-table-column label="送货单信息" align="center" width="110"> <template slot-scope="scope"> <el-button slo...

element+vue显示数据库数据

App.vue <template><div class="app"><div id="heard"><h1>部门统计</h1></div><div id="Statistics"><div id="heard3"><h4>统计项</h4>...