[工具(前端)] 全局组件+函数调用

[工具(前端)] 全局组件+函数调用

写一个组件,并且调用对前端开发者来说是一件非常容易的事情.

但是在实际开发中,比如:前端在调用后端接口时,需要弹出一个loading的遮罩层来防止用户多次点击,当接收到回调时,关闭遮罩层.我们该如何实现?

  • 如果使用一般组件进行调用,是可以实现的,可以当项目有非常的多的界面时,每个界面都要引用这个组件,如果修改了这个组件,势必会导致要修改所有引用了该组件的界面,想想就是一种折磨!!!所以这个时候需要一种封装的思想,也就是将该组件全局化.
文章以全局loading组件为例,进行简单的全局组件+函数调用的使用

代码仓库在 [工具(前端)] 后台管理模板有说明

开搞

根据vue3文档,以及百度,总结一下思路

生成组件实例->挂载在某个dom结点下->调用组件内部方法,进行显示与隐藏

    1. 新建组件 component/loading/index.vue
<template>
    <div class="cusLoading" v-if="isShow">
        <div class="loader">
            <div class="spinner"></div>
            <div class="text">{{content}}</div>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                content: 'Loading',
                isShow :false,
            }
        },
        mounted() {

        },
        methods: {
            show(text){
                this.isShow = true;
                this.content=text;
            },
        },
        components: {}
    }
</script>
...

利用内部的show方法进行显示

  • 2.新建文件 component/loading/index.js

该文件的功能就是为了实例化组件,并挂载在dom结点上

import cusLoadingComponent from "./index.vue";
import { createApp, h } from "vue";
const app = createApp(cusLoadingComponent); //实例化组件
const div = document.createElement("div"); //生成div结点
document.body.appendChild(div);  //将div结点挂载到body下

const instance = app.mount(div); //将loading组件挂载在div结点下,并返回实例对象

export default {
    show(txt='Loading'){ 
        instance.show(txt); //调用loading实例对象的show方法
    },
    close(){
        app.unmount(div);  //销毁结点
        div.remove();
    }
}
    1. 引用

挂载到vue的原型上

//main.js
import loading from './components/loading/index.js'
app.config.globalProperties.$loading = loading;
    1. 使用

单个界面中的使用

//home.vue

//显示
 this.$loading.show();
//关闭
 this.$loading.close();

在http.js(axios封装中使用)

//http.js
import loading from '../components/cusLoading/index.js'

// axios 请求拦截 
service.interceptors.request.use(
    config => {
        loading.show();
        return config
    },
    err => { 	return Promise.reject(err); }
);

//axios 相应拦截
service.interceptors.response.use(
    response => {
        loading.close();
        return response
    },
    err => { 	return Promise.reject(err); }
);
我们看下效果

1701.png

我们可以看到红框中生成了组件的实例对象

最后

这只是全局组件的函数调用的一种简单实现,还有很多功能和方法需要同学们自行去探索,我这里只是开了个头,如果文章有什么错误的地方,可以联系我,或者加群讨论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值