vue中通过js导出定义共享变量

首先创建一个js文件

devlist.js
export const dmhData = {
    dmhJzSignalsList: [],
    dmhSectorList: [],
    dmhTurnoutList: [],
}

然后在需要赋值的组件引入

one.vue

<script setup>
import {dmhData} from "../devlist";
function setData(){
	dmhData.dmhSectorList = [] //里面进行赋值
}
</script>

然后在另一个组件中获取值

two.vue

<script setup>
import {dmhData} from "../devlist";
let isChecking = true;

//这里因为我两个组件是同步操作数据的,会出现调用取值方法在赋值方法之前,所以这样去循环获取一下值。如果取值方法在赋值方法是有固定先后顺序的,则可以直接获取值
function geDevData() {
  if (dmhData.dmhSectorList.length > 0) {
    // 停止检查并开始处理数据
    isChecking = false;
    console.log(dmhData.dmhSectorList)
  } else if (isChecking) {
    // 继续检查
    setTimeout(geDevData, 100); // 每隔一秒检查一次
  }
}


onMounted(() => {
  geDevData();
})
</script>
<think>好的,我需要帮助用户了解如何在Vue3项目中定义全局可用的变量。根据用户提供的引用内容,特别是引用[2],里面提到了两种方法:使用app.config.globalProperties和通过模块导出全局变量。让我先理清这两种方法的步骤和注意事项。 首先,用户提到在Vue3中,可以通过createApp创建应用实例后,使用app.config.globalProperties来添加全局属性。例如,引用[2]中的例子是将$mark_data设置为webdata。这可能适用于在组件中通过this访问,但在组合式API中可能需要不同的方式。同时,用户还提到在模板中使用的问题,比如在template里可能需要通过getApp()来访问,但引用[1]指出在Vue3中可能需要使用其他方法,比如在script标签内定义变量。这里可能存在一些混淆,需要澄清。 接下来,第二种方法是使用模块导出全局变量,如创建一个global.js文件,导出需要的变量,然后在各个组件中导入。这种方法简单,但需要每次导入,可能不够方便。另外,引用[4]提到使用localStorage来存储全局数据,这也是一种方法,但需要考虑数据持久化和安全性问题。 用户可能还关心如何在不同环境中使用这些变量,比如在模板、选项式API和组合式API中的区别。需要分情况说明,并提供代码示例。例如,在选项式API中,可以通过this.$globalVar访问,而在组合式API中可能需要使用getCurrentInstance来获取实例,或者直接导入模块。 此外,需要注意Vue3的变化,比如不再有Vue.prototype,而是使用globalProperties。同时,引用[3]提到的JSON全局变量可能涉及如何在globalProperties中正确绑定数据,避免响应性问题,可能需要使用reactive或ref来保持响应性。 最后,需要总结各种方法的优缺点,帮助用户根据具体场景选择合适的方式。比如,对于小型项目,模块导入可能足够;对于需要响应式数据的情况,使用provide/inject或globalProperties更合适;而需要持久化存储则考虑localStorage。</think>在Vue3中定义全局变量主要有以下三种实现方式,根据应用场景选择最合适的方法: ### 一、使用app.config.globalProperties(推荐) **步骤说明:** 1. 在入口文件(main.js/ts)创建应用实例 2. 通过`config.globalProperties`添加全局属性 3. 在组件中使用`this.$变量名`访问 ```javascript // main.js import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) // 定义全局变量(可包含响应式数据) app.config.globalProperties.$apiBase = 'https://api.example.com' app.config.globalProperties.$themeColor = ref('#1890ff') // 定义全局方法 app.config.globalProperties.$formatTime = (timestamp) => { return new Date(timestamp).toLocaleString() } app.mount('#app') ``` **组件中使用:** ```vue <!-- 选项式API --> <script> export default { mounted() { console.log(this.$apiBase) this.$themeColor.value = '#ff0000' // 修改响应式变量 } } </script> <!-- 组合式API --> <script setup> import { getCurrentInstance } from 'vue' const { proxy } = getCurrentInstance() console.log(proxy.$formatTime(Date.now())) </script> ``` ### 二、模块化全局变量 **实现方式:** 1. 创建单独模块文件 2. 导出需要共享变量 3. 在组件中按需导入 ```javascript // src/utils/globals.js export const globalConfig = { version: '1.0.0', maxItems: 100, debugMode: import.meta.env.DEV } export const sharedData = reactive({ userToken: null, permissions: [] }) ``` **组件中使用:** ```vue <script setup> import { globalConfig, sharedData } from '@/utils/globals' const updateToken = (token) => { sharedData.userToken = token } </script> ``` ### 三、结合状态管理(复杂场景推荐) 对于需要响应式更新和跨组件同步的全局数据,建议使用Pinia状态管理库: ```javascript // stores/global.js import { defineStore } from 'pinia' export const useGlobalStore = defineStore('global', { state: () => ({ loading: false, deviceType: navigator.userAgent.match(/Mobile/) ? 'mobile' : 'desktop' }), actions: { setLoading(status) { this.loading = status } } }) ``` **组件中使用:** ```vue <script setup> import { useGlobalStore } from '@/stores/global' const global = useGlobalStore() const toggleLoading = () => { global.setLoading(!global.loading) } </script> ``` ### 各方案对比表 | 方案 | 优点 | 缺点 | 适用场景 | |----------------------|-----------------------------|-----------------------------|-------------------------| | globalProperties | 原生支持,使用简单 | 类型提示需要额外配置 | 小型项目,简单全局配置 | | 模块化全局变量 | 代码结构清晰 | 需要手动导入 | 工具类配置/静态数据 | | Pinia状态管理 | 响应式完善,类型安全 | 需要学习额外API | 复杂应用,需要状态同步 | | localStorage | 持久化存储 | 需手动序列化,安全性需注意 | 用户偏好设置等持久化数据[^4] | ### 注意事项 1. **类型声明**:使用globalProperties时,需在`src/env.d.ts`添加类型声明: ```typescript declare module '@vue/runtime-core' { interface ComponentCustomProperties { $apiBase: string $formatTime: (timestamp: number) => string } } ``` 2. **响应式更新**:通过globalProperties绑定的变量需要手动使用`ref/reactive`包装才能实现响应式更新 3. **服务端渲染(SSR)**:在服务端渲染场景下,应避免使用globalProperties,推荐使用provide/inject方式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值