优雅地使用loading(推荐)


Posted in Javascript onApril 20, 2019

前言 

不知道从什么时候开始有了写博客的想法,奈何自己的知识储备还很薄弱,迟迟无法下笔。这是我的第一篇博客,算是记录一下自己学习前端以来的一些知识吧。如有错漏,恳请指出,您的批评和指正是我前进路上的一大动力!

在平时的开发过程中,我们需要异步等待数据,常常会利用loading图来加强用户的体验,让用户知道我们有在加载,那么如何在开发过程中更为优雅地使用loading呢?开发小程序的时候我们只需要一句wx.showLoading()就完事儿了,而在web开发中也有相应的UI框架来帮我们完成这件事情。那究竟是怎么实现的呢,让我们来一起看一下。

先实现一个简单的loading

<div class="container">
 <div class="loading"></div>
</div>
.container {
 position: absolute;
 left: 50%;
 top: 50%;
 transform: translate(-50%, -50%);
}

.loading {
 width: 100px;
 height: 100px;
 border-radius: 100%;
 border: 5px #ffffff solid;
 border-right-color: #87CEEB;
 animation: loading 1s linear infinite;
}

@keyframes loading {
 0% {
 transform: rotate(0deg);
 }
 100% {
 transform: rotate(360deg);
 }
}

这样我们就实现了一个比较简单的转圈圈loading图,下面我将分别叙述在vue和react中如何优雅地使用这个loading。

Vue部分

首先先用vue init webpack生成一个vue脚手架,插件的目录如下图所示

优雅地使用loading(推荐)

loading.vue里写进了我们上面实现的简单loading的代码,加上一点点逻辑

<script>
 export default {
 name: "loading",
 data() {
  return {
  show: false
  }
 }
 }
</script>

index.js

//先引入loading组件
import LoadingComponent from './loading'
const Loading = {}
Loading.install = function (Vue) {
// 生成一个Vue的子类 同时这个子类也就是组件
const ToastConstructor = Vue.extend(LoadingComponent)
// 生成一个该子类的实例
const instance = new ToastConstructor()
// 将这个实例挂载在我创建的div上
// 并将此div加入全局挂载点内部
instance.$mount(document.createElement('div'))
document.body.appendChild(instance.$el)
//注入vue的原型链
Vue.prototype.$loading = {
 show() {
  instance.show = true
 },
 close(){ 
  instance.show = false
  }
 }
}
export default Loading

这里我们生成个一个Vue的子类,然后将它的实例挂载到全局。将一些方法注入到Vue的原型链中,这样就可以在任何组件中通过类似于this.$loading.show()的方法来控制loading图的显示和隐藏。最后我们导出Loading对象。然后在main.js中引入Loading插件,并调用Vue.use()方法来注册插件

优雅地使用loading(推荐)

最后,让我们来测试一下吧。测试代码如下,用setTimeout来模拟异步请求。

<script>
 export default {
 name: 'HelloWorld',
 data() {
  return {
  msg: ''
  }
 },
 mounted() {
  this.$loading.show()
  setTimeout(()=>{
  this.$loading.close()
  this.msg = '加载完辽!'
  },3000)
 }
 }
</script>

优雅地使用loading(推荐)

奶思!测试成功!

React部分

在此之前,我先介绍一下react中的高阶组件(HOC)

高阶组件

在React中,多个不同的组件中如果需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件。但是由于Mixin过多会使使得组件难以维护,在React ES6中Mixin不再被支持。高阶组件是一个接替Mixin实现抽象组件公共功能的好方法。高阶组件其实是一个函数,接收一个组件作为参数,返回一个包装组件作为返回值,类似于高阶函数。

具体实现

先用create-react-app 生成一个测试脚手架,高阶组件目录如下图所示

 优雅地使用loading(推荐)

index.css主要是loading的样式,index.js的代码如下

import React from 'react';
import './index.css'

function hoc(ComponentClass) {
 return class HOC extends ComponentClass {
  render() {
   if (!this.state.loading) {
    console.log(this.state.loading)
    return super.render()
   }
   else {
    return (<div>
     <div className="container">
      <div className="loading"></div>
     </div>
    </div>)
   }
  }
 }
}

export default hoc

我们定义了一个hoc函数,接受一个组件作为参数。通过this.state来操作组件的state属性,通过super.render()来渲染组件。最后导出hoc函数。然后在组件中引入,如下

import hoc from '../hoc/loading/index'

class Home extends Component {
 constructor(props) {
  super(props)
  this.state = {
   msg: '还没加载好',
   loading: true
  }
 }

 render() {
  return (
   <div>
    {this.state.msg}
   </div>
  );
 }

 componentDidMount() {
  let loading = this.state.loading
  setTimeout(() => {
   this.setState({
    loading: !loading,
    msg: '加载完辽!'
   })
  }, 3000)
 }
}

export default hoc(Home)

同样是采用setTimeout来模拟异步请求,测试结果也是成功的。react部分并没有用装饰器来使用高阶组件,还不够优雅。。。(在create-react-app中把网上的处理方法都试了一遍,还是报错。。)

最后 

至此,在Vue和React中如何优雅地使用loading就到此结束辽。这是一个超简易版的demo,但还是希望能分享给大家。写完才真正体会到了那句老话,纸上得来终觉浅,绝知此事要躬行。

以上所述是小编给大家介绍的loading使用解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
原生js编写设为首页兼容ie、火狐和谷歌
Jun 05 Javascript
javascript修改图片src的方法
Jan 27 Javascript
javascript 常用验证函数总结
Jun 28 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
Apr 13 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
node之本地服务器图片上传的方法示例
Mar 26 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 Javascript
详解nvm管理多版本node踩坑
Jul 26 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 #Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 #Javascript
函数式编程入门实践(一)
Apr 20 #Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 #Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
Apr 20 #Javascript
详解vue使用$http服务端收不到参数
Apr 19 #Javascript
ajaxfileupload.js实现上传文件功能
Apr 19 #Javascript
You might like
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
对Python实现累加函数的方法详解
2019/01/23 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
护士自荐信怎么写
2013/10/18 职场文书
团日活动总结怎么写
2014/06/25 职场文书
离婚起诉书范本
2015/05/18 职场文书
战友聚会致辞
2015/07/28 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis