vue3.x如何注册全局组件/方法(替代vue2.x的Vue.prototype)

vue3.x如何注册全局组件/方法(替代vue2.x的Vue.prototype)

上一章我们讲过vue2.x利用Vue.prototype注册全局组件/方法,然而vue3.x是无法通过Vue.prototype来注册全局组件/方法的,因此需要另辟蹊径。

vue3.x注册全局组件/方法主要有以下两个方式:

  1. provide / inject (推荐)

    main.js中:通过provide将组件或者方法、变量挂载在全局

    import { createApp } from 'vue';
    import App from './App.vue';
    import router from './router';
    import store from './store';
    
    const app = createApp(App);
    
    app.use(store);
    app.use(router);
    
    // 挂载全局方法
    const globalFunc = () => {
    	console.log('要挂载在全局的方法');
    }
    // 将globalFunc方法挂载在全局
    app.provide('globalFunc', globalFunc);
    
    app.mount('#app');
    
    // 把vue实例挂载在window.vm,方便使用vue的实例
    window.vm = app;
    
    

    组件中:通过inject获取全局方法并调用

    <template>
      <div>组件中通过inject获取全局方法并调用</div>
    </template>
    <script lang="ts">
    import { defineComponent, onMounted, inject } from 'vue';
    export default defineComponent({
      name: 'JobDetail',
      // 注册组件
      components: {
        Header,
      },
      setup() {
        onMounted(() => {
          testFunc();
        });
    
        const testFunc = (): void => {
          const globalFunc: any = inject('globalFunc'); // 通过inject获取挂载在全局的globalFunc方法
          globalFunc();
        };
    
        return {
          testFunc,
        };
      },
    });
    </script>
    
  2. app.config.globalProperties(不推荐)

    main.js中:通过app.config.globalProperties将组件或者方法、变量挂载在全局

    import { createApp } from 'vue';
    import App from './App.vue';
    import router from './router';
    import store from './store';
    
    const app = createApp(App);
    
    app.use(store);
    app.use(router);
    
    // 挂载全局方法
    const globalFunc = () => {
    	console.log('要挂载在全局的方法');
    }
    // 将globalFunc方法挂载在全局
    app.config.globalProperties.globalFunc = globalFunc;
    
    app.mount('#app');
    
    // 把vue实例挂载在window.vm,方便使用vue的实例
    window.vm = app;
    

    组件中:通过getCurrentInstance().appContext.config.globalProperties获取全局方法并调用

    <template>
      <div>组件中通过inject获取全局方法并调用</div>
    </template>
    <script lang="ts">
    import { defineComponent, onMounted, getCurrentInstance } from 'vue';
    export default defineComponent({
      name: 'JobDetail',
      // 注册组件
      components: {
        Header,
      },
      setup() {
        onMounted(() => {
          testFunc();
        });
    
        const testFunc = (): void => {
          const internalInstance: any = getCurrentInstance();
          console.log(internalInstance.appContext.config.globalProperties);
          // 通过getCurrentInstance().appContext.config.globalProperties获取全局方法并调用
          internalInstance.appContext.config.globalProperties.globalFunc();
        };
    
        return {
          testFunc,
        };
      },
    });
    </script>
    

    在这里插入图片描述
    需要注意的是:
    vue3官网提示
    getCurrentInstance only works during setup or Lifecycle Hooks
    When using outside of setup or Lifecycle Hooks, please call getCurrentInstance() on setup and use the instance instead.
    在这里插入图片描述

文章参考:
https://www.5axxw.com/questions/content/nsd3mq
https://www.cnblogs.com/xiaoyan2017/p/14221729.html
https://www.freesion.com/article/40251353944/
https://blog.csdn.net/weixin_43273755/article/details/115311398

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值