一起写一个即插即用的Vue Loading插件实现

2020-06-12 20:52:04易采站长站整理

设置全局拦截,请求开始前设置状态为加载。
设置全局拦截,请求结束后设置状态为完成。
在触发请求的函数中进行拦截,触发前设置为加载,触发后设置为完成。
判断请求后的数据是否为非空,如果非空则设置为完成

最终可以实现的情况上,进行全局拦截设置,然后局部的判断是最容易想到也是最容易实现的方案。给每个触发的函数设置

before
after
看起来美好,但实现起来简直是灾难,我们并没有
before
after
这两个函数钩子来告诉我们函数什么时候调用了和调用完了,自己实现吧坑很多,不实现吧又没得用只能去原函数里一个个写上。只判断数据局限性很大,只有一次机会。

既然是即插即用的插件,使用起来就得突出一个简单易用,基本思路上也是使用全局拦截,但局部判断方面与常规略有不同,使用数据绑定(当然也可以再次全局响应拦截),咱们实现起来吧~。

样式

Loading嘛,必须得有一个转圈圈才能叫Loading,样式并不是这个插件的最主要的,这里直接用CSS实现一个容易实现又不显得很糙的:


<template>
<div class="loading">
</div>
</template>
...
<style scoped>
.loading {
width: 50px;
height: 50px;
border: 4px solid rgba(0,0,0,0.1);
border-radius: 50%;
border-left-color: red;
animation: loading 1s infinite linear;
}

@keyframes loading {
0% { transform: rotate(0deg) }
100% { transform: rotate(360deg) }
}
</style>

固定大小50px的正方形,使用

border-radius
把它盘得圆润一些,
border
设置个进度条底座,
border-left-color
设置为进度条好了。

演示地址

绑定数据与URL

提供外部使用接口

上面思路中提到,这个插件是用全局拦截与数据绑定制作的:

暴露一个 source 属性,从使用的组件中获取出要绑定的数据。
暴露一个 urls 属性,从使用的组件中获取出要拦截的URL。


<template>
...
</template>
<script>
export default {

props: {
source: {
require: true
},
urls: {
type: Array,
default: () => { new Array() }