vue3 + TS 定义全局变量和方法

vue3 定义全局变量主要是利用组件实例中的 globalProperties 属性 来完成绑定。

1. 绑定赋值

我们直接来封装一个插件,方便后期管理。

  • global.ts
import type { App } from "vue";

const fn = () => "鱼钓猫的小鱼干";

export default {
  // 这里的 app 就是 main.ts 中创建的实例
  install(app: App) {
    app.config.globalProperties.$env = "dev";
    app.config.globalProperties.$fishingcat = fn;
  },
};
  • main.ts
import "./assets/main.css";
import { createApp } from "vue";

import App from "./App.vue";
// 引入插件
import global from "@/plugin/global";

const app = createApp(App);
// 注册插件
app.use(global);

app.mount("#app");

2. 应用

  • 绑定的全局变量或方法可以直接在任何组件中的 template 模版中直接使用。

index.vue

<template>
  <h1>{{ $env }}</h1>
  <h1>{{ $fishingcat() }}</h1>
</template>

我是效果图
在这里插入图片描述

  • ts 中需要在组件实例中访问。
<script setup lang="ts">

import { getCurrentInstance } from "vue";
const instance = getCurrentInstance();

// 在实例中的 proxy属性 上可以访问到所有的全局属性或方法
console.log(instance?.proxy?.$env); // "dev"

</script>

3. 完善

代码可以正常执行,但还有一点小问题:不存在该属性或方法。

在这里插入图片描述

这是因为,我们自定义的全局变量和方法缺少 类型声明 ,所以我们需要手动补充声明。
这是固定格式,在 ComponentCustomProperties 中定义类型。

declare module "@vue/runtime-core" {
  export interface ComponentCustomProperties {
    $env: string;
    $fishingcat: () => string;
  }
}

如果数量多的话,可以专门创建一个 ***.d.ts 文件去补充类型声明,这里我图省事直接写在一起了。

global.ts

import type { App } from "vue";

const fn = () => "鱼钓猫的小鱼干";

export default {
  install(app: App) {
    app.config.globalProperties.$env = "dev";
    app.config.globalProperties.$fishingcat = fn;
  },
};

declare module "@vue/runtime-core" {
  export interface ComponentCustomProperties {
    $env: string;
    $fishingcat: () => string;
  }
}

然后,一切恢复正常,完美结束!

Vue 3 中使用 TypeScript 定义全局方法和变量的方式与 Vue 2 有些不同。下面分别给出定义全局方法全局变量方法。 ### 定义全局方法 可以在 `src/main.ts` 文件中定义全局方法,例如: ```typescript import { createApp } from 'vue'; declare module '@vue/runtime-core' { interface ComponentCustomProperties { $myGlobalMethod: () => void; } } const app = createApp(App); app.config.globalProperties.$myGlobalMethod = () => { console.log('This is a global method!'); }; app.mount('#app'); ``` 在上面的例子中,我们使用 `declare module` 声明了一个模块,然后在 `ComponentCustomProperties` 接口中添加了一个 `$myGlobalMethod` 属性,它是一个函数类型,不接收参数,返回值为 `void`。接着,我们在 `app.config.globalProperties` 上挂载了实现该方法的函数。 这样,在 Vue 应用程序的任意组件中都可以使用 `$myGlobalMethod` 方法,例如: ```vue <template> <button @click="$myGlobalMethod()">Click me!</button> </template> ``` ### 定义全局变量 可以在 `src/main.ts` 文件中定义全局变量,例如: ```typescript import { createApp } from 'vue'; declare module '@vue/runtime-core' { interface ComponentCustomProperties { $myGlobalVariable: string; } } const app = createApp(App); app.config.globalProperties.$myGlobalVariable = 'This is a global variable!'; app.mount('#app'); ``` 在上面的例子中,我们同样使用 `declare module` 声明了一个模块,然后在 `ComponentCustomProperties` 接口中添加了一个 `$myGlobalVariable` 属性,它是一个字符串类型。接着,我们在 `app.config.globalProperties` 上挂载了该全局变量的值。 这样,在 Vue 应用程序的任意组件中都可以使用 `$myGlobalVariable` 变量,例如: ```vue <template> <p>{{ $myGlobalVariable }}</p> </template> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值