Vue3设置全局变量的四种方法

更新日期: 2025-12-18 阅读: 19 标签: 变量

vue3项目中,我们经常需要在多个组件之间共享数据。比如用户登录信息、应用主题设置、api地址等。这些数据如果每个组件都单独管理,会很麻烦。下面介绍四种设置全局变量的方法,你可以根据项目需求选择合适的方式。


1. 使用 app.config.globalProperties

这是Vue3官方提供的一种方法。你可以把变量或方法挂载到Vue应用的全局实例上,然后在任何组件中通过 this 访问。

具体做法

在 main.js 或 main.ts 文件中设置:

import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

// 定义全局数据
const globalData = {
  apiBaseUrl: 'https://api.yoursite.com/v1',
  siteName: '我的Vue应用',
  showToast(message) {
    // 显示提示框的逻辑
    console.log('Toast:', message)
  }
}

// 挂载到全局属性
app.config.globalProperties.$global = globalData

app.mount('#app')

在组件中使用:

<template>
  <div>
    <h1>欢迎来到 {{ $global.siteName }}</h1>
    <button @click="fetchData">获取数据</button>
  </div>
</template>

<script>
export default {
  methods: {
    fetchData() {
      const url = this.$global.apiBaseUrl + '/user'
      console.log('请求地址:', url)
      this.$global.showToast('开始获取数据')
    }
  }
}
</script>

注意事项

如果你使用TypeScript,需要在类型声明文件中添加:

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $global: {
      apiBaseUrl: string;
      siteName: string;
      showToast: (msg: string) => void;
    }
  }
}

在 <script setup> 语法中,需要使用 getCurrentInstance:

<script setup>
import { getCurrentInstance } from 'vue'

const instance = getCurrentInstance()
const globalData = instance?.appContext.config.globalProperties.$global

const handleClick = () => {
  globalData?.showToast('来自setup的消息')
}
</script>

适用场景:适合从Vue2升级的项目,或者在选项式API中使用。


2. 使用依赖注入(Provide / Inject)

这是Vue3推荐的方式,特别适合组合式API。在应用顶层提供数据,在子组件中注入使用。

具体做法

在 main.js 中提供数据:

import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

const globalData = {
  apiBaseUrl: 'https://api.yoursite.com/v1',
  siteName: '我的Vue应用',
}

// 提供全局数据
app.provide('globalData', globalData)

app.mount('#app')

在子组件中注入使用:

<template>
  <div>
    <p>网站名称:{{ siteName }}</p>
    <button @click="testApi">测试API地址</button>
  </div>
</template>

<script setup>
import { inject } from 'vue'

// 注入全局数据
const globalData = inject('globalData')
const siteName = globalData.siteName

const testApi = () => {
  console.log('API基础地址是:', globalData.apiBaseUrl)
}
</script>

响应式数据示例

你可以提供响应式数据,这样所有使用该数据的组件都会同步更新:

import { createApp, reactive } from 'vue'
import App from './App.vue'

const app = createApp(App)

// 创建响应式全局状态
const globalState = reactive({
  user: {
    name: '访客',
    isLogin: false
  },
  theme: 'light'
})

// 提供修改状态的方法
function login(userInfo) {
  globalState.user.name = userInfo.name
  globalState.user.isLogin = true
}

app.provide('globalState', globalState)
app.provide('login', login)

app.mount('#app')

适用场景:适合组合式API项目,需要响应式数据的场景。


3. 使用状态管理(Pinia)

Pinia是Vue3官方推荐的状态管理库。它适合管理复杂的全局状态,功能强大且支持TypeScript。

具体做法

首先安装Pinia:

npm install pinia

在 main.js 中设置:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const app = createApp(App)
const pinia = createPinia()

app.use(pinia)
app.mount('#app')

创建状态仓库:

// src/stores/global.js
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useGlobalStore = defineStore('global', () => {
  // 状态
  const siteName = ref('我的Vue应用')
  const apiBaseUrl = ref('https://api.yoursite.com/v1')
  const user = ref({ name: '访客', isLogin: false })
  const theme = ref('light')

  // 计算属性
  const welcomeMessage = computed(() => {
    return user.value.isLogin ? `欢迎回来,${user.value.name}` : '请先登录'
  })

  // 方法
  function login(userInfo) {
    user.value.name = userInfo.name
    user.value.isLogin = true
  }

  function logout() {
    user.value.name = '访客'
    user.value.isLogin = false
  }

  function toggleTheme() {
    theme.value = theme.value === 'light' ? 'dark' : 'light'
  }

  return {
    siteName,
    apiBaseUrl,
    user,
    theme,
    welcomeMessage,
    login,
    logout,
    toggleTheme
  }
})

在组件中使用:

<template>
  <div :class="`app-${globalStore.theme}`">
    <h1>{{ globalStore.siteName }}</h1>
    <p>{{ globalStore.welcomeMessage }}</p>
    <button @click="handleLogin">登录</button>
    <button @click="globalStore.toggleTheme">切换主题</button>
  </div>
</template>

<script setup>
import { useGlobalStore } from '@/stores/global'

const globalStore = useGlobalStore()

const handleLogin = () => {
  globalStore.login({ name: '李四' })
}
</script>

适用场景:中大型项目,需要管理复杂状态的情况。


4. 使用纯JavaScript模块

如果只是需要共享一些不会变化的配置或工具函数,一个简单的JavaScript模块就足够了。

具体做法

创建配置文件:

// src/config/constants.js
export const API_BASE_URL = 'https://api.yoursite.com/v1'
export const SITE_NAME = '我的Vue应用'
export const APP_VERSION = '1.0.0'
export const MAX_UPLOAD_SIZE = 5 * 1024 * 1024 // 5MB

// 工具函数
export function formatDate(date) {
  return new Date(date).toLocaleDateString()
}

export function formatPrice(price) {
  return '¥' + price.toFixed(2)
}

在组件中导入使用:

<script setup>
import { API_BASE_URL, SITE_NAME, formatDate } from '@/config/constants'

console.log(`正在访问 ${SITE_NAME},API地址:${API_BASE_URL}`)
const today = formatDate(new Date())
</script>

适用场景:静态配置、工具函数等不会变化的数据。


如何选择合适的方法

方法适用场景优点缺点
app.config.globalPropertiesVue2升级项目,选项式API简单直接,类似Vue2写法组合式API中使用不便
Provide / Inject组合式API,响应式数据共享官方推荐,响应式支持好数据流向是单向的
Pinia中大型项目,复杂状态管理功能强大,TypeScript支持好需要学习额外概念
JavaScript模块静态配置,工具函数最简单,零依赖,性能好不支持响应式

实际应用建议

  1. 小型项目:如果只是共享几个配置项,用JavaScript模块最方便。

  2. 中型项目:需要响应式数据共享,使用Provide / Inject。

  3. 大型项目:状态复杂,需要严格管理,使用Pinia。

  4. Vue2迁移项目:习惯使用this访问全局数据,可以用app.config.globalProperties。

记住,选择哪种方法要看具体需求。不要为了用而用,简单有效才是最重要的。先从小处开始,随着项目发展再调整方案。


常见问题解答

Q:哪种方法性能最好?
A:JavaScript模块性能最好,因为它没有响应式系统的开销。

Q:Pinia和Vuex有什么区别?
A:Pinia是Vue3的官方推荐,API更简洁,TypeScript支持更好,学习成本更低。

Q:全局变量太多怎么办?
A:按功能拆分。用户相关的放一起,配置相关的放一起,不要全部堆在一个地方。

Q:响应式数据会影响性能吗?
A:会有一点影响,但现代浏览器处理能力很强,一般不用担心。只有数据量很大时才需要考虑优化。

掌握这四种方法,你就能应对Vue3项目中各种全局数据共享的需求了。根据项目实际情况选择合适的方法,让代码更清晰,更易维护。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13296

css自定义变量_初次接触CSS变量

本文的目的主要是展示CSS变量是如何工作的。随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性的机制。

CSS变量(自定义属性)实践指南

Sass和Less这样的预处理器,让我们的CSS代码保持良好的结构和可维护性。像变量、混合(mixins)、循环控制等特性,增强了动态编写CSS的能力,从而减少重复代码,也加快了我们开发速度。

css变量_原生css 中变量的使用

原生css 中变量的使用,这个重要的 CSS 新功能,所有主要浏览器已经都支持了。本文全面介绍如何使用它,你会发现原生 CSS 从此变得异常强大。声明变量的时候,变量名前面要加两根连词线(--),var()函数用于读取变量。

理解var let const区别

JavaScript中var、let、const区别?js中let和const都是es5版本新的命名规范,在此之前定定义一个变量只能用var。我们可以把let和const看做是为了弥补var的一些不足而新设计出来的

一个例子,变量提升和函数提升就是这么简单!

引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。

CSS变量使用解析

很早直接就了解到CSS变量相关的内容,奈何之前使用价值不高(很多主流浏览器不兼容),最近发现主流浏览器都已经支持了这一变化,CSS变量就像JS的变量,每个类名或者花括号就像一个function,里面的变量只有上下文以内可以获取,这就让CSS有了更多可能性。

let与var的区别,为什么要用let?

var是全局声明,let是块级作用的,只适用于当前代码块;var变量会发生变量提升,let则不会进行变量提升;var 会造成重复赋值,循环里的赋值可能会造成变量泄露至全局

ES6-变量的解构赋值

解构赋值官方解释:按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。变量的解构赋值就是一种写法,掌握了这种写法可以让我们在书写 javascript 代码时可以更加的简单,迅捷。

JS中变量的存储

JS中的变量是保存在栈内存中的:1.基本数据类型的值直接在栈内存中存储;2.值与值之间是独立存在的,修改一个变量不会影响其他变量;对象是保存到堆内存中的,每创建一个新的对象

js 交换变量值的方法总汇

这篇文章总结七种办法来交换a和b的变量值 。最最最简单的办法就是使用一个临时变量了 ,最后我的方案是利用了ES6的解构赋值语法 ,它允许我们提取数组和对象的值,对变量进行赋值

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!