Vue.extend是一个全局Api,平时我们在开发业务的时候很少会用到它,但有时候我们希望可以开发一些全局组件比如Loading,Notify,Message等组件时,这时候就可以使用Vue.extend。
同学们在使用element-ui的loading时,在代码中可能会这样写
// 显示loading
const loading = this.$loading()
// 关闭loading
loading.close()
1
2
3
4
2
3
4
这样写可能没什么特别的,但是如果你这样写
const loading = this.$loading()
const loading1 = this.$loading()
setTimeout(() => {
loading.close()
}, 1000 * 3)
1
2
3
4
5
2
3
4
5
这时候你会发现,我调用了两次loading,但是只出现了一个,而且我只关闭了loading,但是loading1也被关闭了。这是怎么实现的呢?我们现在就是用Vue.extend + 单例模式去实现一个loading
# 开发loading组件
<template>
<transition name="custom-loading-fade">
<!--loading蒙版-->
<div v-show="visible" class="custom-loading-mask">
<!--loading中间的图标-->
<div class="custom-loading-spinner">
<i class="custom-spinner-icon"></i>
<!--loading上面显示的文字-->
<p class="custom-loading-text">{{ text }}</p>
</div>
</div>
</transition>
</template>
<script>
export default {
props: {
// 是否显示loading
visible: {
type: Boolean,
default: false
},
// loading上面的显示文字
text: {
type: String,
default: ''
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
开发出来loading组件之后,如果需要直接使用,就要这样去用
<template>
<div class="component-code">
<!--其他一堆代码-->
<custom-loading :visible="visible" text="加载中" />
</div>
</template>
<script>
export default {
data() {
return {
visible: false
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15