前言
不知道从什么时候开始有了写博客的想法,奈何自己的知识储备还很薄弱,迟迟无法下笔。这是我的第一篇博客,算是记录一下自己学习前端以来的一些知识吧。如有错漏,恳请指出,您的批评和指正是我前进路上的一大动力!
在平时的开发过程中,我们需要异步等待数据,常常会利用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.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()方法来注册插件
最后,让我们来测试一下吧。测试代码如下,用setTimeout来模拟异步请求。
<script> export default { name: 'HelloWorld', data() { return { msg: '' } }, mounted() { this.$loading.show() setTimeout(()=>{ this.$loading.close() this.msg = '加载完辽!' },3000) } } </script>
奶思!测试成功!
React部分
在此之前,我先介绍一下react中的高阶组件(HOC)
高阶组件
在React中,多个不同的组件中如果需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件。但是由于Mixin过多会使使得组件难以维护,在React ES6中Mixin不再被支持。高阶组件是一个接替Mixin实现抽象组件公共功能的好方法。高阶组件其实是一个函数,接收一个组件作为参数,返回一个包装组件作为返回值,类似于高阶函数。
具体实现
先用create-react-app 生成一个测试脚手架,高阶组件目录如下图所示
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使用解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]