Appearance
加载动画
全局加载动画组件示例
加载动画组件代码大致如下
vue
<template>
<div :class="['xiaobu-loading-mask', show ? 'show' : 'hide']" v-show="show" @scroll.stop>
<div class="loading-wrapper">
<span class="loading-dot loading-dot-spin">
<i></i>
<i></i>
<i></i>
<i></i>
</span>
</div>
</div>
</template>
<script>
export default {
name: "Loading",
computed: {
show() {
// 使用vuex中的store的 showLoading变量控制
return this.$store.state.app.showLoading
}
}
}
</script>
<style scoped>
.xiaobu-loading-mask {
position: fixed;
left: 0;
top: 0;
height: 100%;
width: 100%;
background: rgba(0, 0, 0, 0.3);
user-select: none;
z-index: 9999;
overflow: hidden
}
.loading-wrapper {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -100%)
}
.loading-dot {
animation: antRotate 1.2s infinite linear;
transform: rotate(45deg);
position: relative;
display: inline-block;
font-size: 64px;
width: 37px;
height: 37px;
box-sizing: border-box
}
.loading-dot i {
width: 15px;
height: 15px;
position: absolute;
display: block;
background: #4077F4;
border-radius: 100%;
transform: scale(.75);
transform-origin: 50% 50%;
opacity: .3;
animation: antSpinMove 1s infinite linear alternate
}
.loading-dot i:nth-child(1) {
top: 0;
left: 0
}
.loading-dot i:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: .4s;
animation-delay: .4s
}
.loading-dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: .8s;
animation-delay: .8s
}
.loading-dot i:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@keyframes antSpinMove {
to {
opacity: 1
}
}
@-webkit-keyframes antSpinMove {
to {
opacity: 1
}
}
</style>在app.vue中引入
vue
<template>
<div id="app">
<!-- 要放在前面,用于后面介绍解决 双加载动画问题 -->
<loading></loading>
<router-view class="xiaobu-app-container" />
</div>
</template>
<script>
import Loading from "@/components/loading"
export default {
name: "App",
components: {
Loading,
},
}
</script>
<style scoped lang="scss">
#app {
width: 100%;
height: 100%;
.xiaobu-app-container {
width: 100%;
height: 100%;
}
}
</style>vue2为例 在store/modules/app.js中新增一个状态变量
js
const state = {
showLoading: false, //展示全局加载动画
}
const mutations = {
//设置请求动画状态
SET_LOADING_STATUS: (state, showLoading) => {
state.showLoading = showLoading
},
}
const actions = {}
export default {
namespaced: true,
state,
mutations,
actions
}这样处理完后配合配置中的showLoadingFun和hideLoadingFun方法即可实现精准控制全局加载动画。
精准控制请求动画原理
优化包有一个变量用于存储当前正在请求的接口数量,当正在请求的接口数量大于0时,触发showLoadingFun方法,当正在请求的接口数量等于0时,触发hideLoadingFun方法。

