vue3 ts 定义全局变量
时间: 2023-02-08 16:29:15 浏览: 174
在 Vue3 中使用 TypeScript 定义全局变量可以这样做:
1. 创建一个文件,如 `global.d.ts`,并在其中声明全局变量。
```
declare global {
const myGlobalVariable: string;
}
```
2. 在 main.ts 或其他入口文件中引入该文件。
```
import './global';
```
3. 在需要使用全局变量的地方直接使用即可。
```
console.log(myGlobalVariable);
```
注意,这种方式只能用于定义全局变量,不能用于定义全局函数或类。
相关问题
在vue3中使用ts定义全局方法和变量
在 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>
```
vue3响应式全局变量
### Vue 3 中创建和使用响应式全局变量
#### 创建 Vue 实例并配置全局属性
为了使全局变量具有响应性,在创建 Vue 应用实例时,应该利用 `createApp` 函数,并通过 `app.config.globalProperties` 来设置全局属性。但是需要注意的是,直接添加到这里的普通 JavaScript 属性不会自动成为响应式的[^2]。
```javascript
import { createApp } from 'vue';
const app = createApp(App);
// 不推荐这样做,因为这些属性不是响应式的
app.config.globalProperties.$nonReactiveProperty = "I'm not reactive";
```
#### 使用 `provide` 和 `inject` 进行依赖注入
另一种方式是采用组合 API 提供的 `provide`/`inject` 对来传递可被后代组件访问的数据或功能。这种方式非常适合用于跨多个层次结构下的子组件间共享状态[^1]。
然而,当目标是在整个应用程序范围内提供服务或者公共数据时,更常见的方式还是修改应用级别的配置项。
#### 利用 `ref` 或者 `reactive` 构建响应式对象
为了让全局变量具备响应能力,应当借助 Composition API 下提供的工具函数——`ref()` 或者 `reactive()` 。前者适用于基本类型的封装;后者则适合处理复杂的数据结构如对象和数组[^4]。
下面是一个完整的例子展示怎样正确地声明以及消费这样的全局资源:
##### 定义全局响应式变量
```typescript
// main.ts
import { createApp, ref, reactive } from 'vue';
import App from './App.vue';
const appInstance = createApp(App);
// 添加一个简单的字符串型响应式属性
appInstance.config.globalProperties.$message = ref('Hello World');
// 如果需要存储更多字段,则考虑使用 reactive()
appInstance.config.globalProperties.$settings = reactive({
theme: 'light',
language: 'en'
});
export default appInstance;
```
##### 在任何地方读取与更新它们
一旦上述操作完成之后,在任意组件内部就可以轻松获取到之前定义好的全局变量了:
```html
<!-- MyComponent.vue -->
<template>
<div>{{ $message }}</div> <!-- 显示当前的消息 -->
<button @click="changeTheme">切换主题</button>
{{ $settings.theme }}
</template>
<script setup lang="ts">
function changeTheme() {
this.$settings.theme === 'dark' ? (this.$settings.theme = 'light') : (this.$settings.theme = 'dark');
}
</script>
```
请注意这里假设你正在使用的脚手架支持 `<script setup>` 的语法糖形式编写单文件组件(SFC),如果不是的话可能需要调整导入逻辑。
另外值得注意的一点是,尽管 `$message` 是由 `ref` 构造而来,但在模板里可以直接当作普通的值去渲染而无需额外解包(`.value`)。这是因为 Vue 自动帮我们做了这一步转换工作。
最后提醒一点关于性能优化方面的小技巧:对于那些只读性质的全局常量来说,没有必要将其设为响应式的,除非确实存在变更的需求。
阅读全文
相关推荐














