vue 建立 全局变量 全局访问

有个问题我还是想深入研究一下
就是关于 vue 中全局变量这个概念 和实现方法的探讨

不少人想都没想, 直接用vuex啊。
对啊, 我也是这个样想的 直接用vuex不就啥事没有了。

vuex支持 定义 修改。
还会实时刷新, 用来记录状态 再好不过

但是其他方式 还是有它的优势的。

方法一 (Vue.prototype)

最简单的方法, 也是最常见的

// main.js

import axios from 'axios'
// 挂载全局方法
Vue.prototype.$http = axios;
Vue.prototype.$Fun = (a = "无") => {
  console.log('$Fun执行, 参数: ' + a);
}

// 挂载全局属性
Vue.prototype.$name = "DWP";
// 任意合法页面 1
console.log(this.$name);   // DWP
console.log(this.$Fun());  // $Fun执行, 参数: 无


this.$name = "DWPNB";
// 检测 全局属性的 读
console.log(this.$name); // DWPNB  ...页面的渲染是不会跟新的
console.log(this.$Fun()); // $Fun执行, 参数: 无

// 任意合法页面 2
console.log(this.$name); // DWP  ...变量实际上并没有更改
console.log(this.$Fun()); // $Fun执行, 参数: 无

结论:

查: 无论是获取变量值, 还是执行方法 都是ok的
改: 页面的渲染是不会跟新的, 并且在其他页面变量还是原来的值

Vue.prototype.xxxx 挂载的是类似常量的东西。
建议 注意使用

方法二 (window._name)

这种方法就比较原始了

// main.js
// 挂载全局属性
window._name = "dwp";
// 挂载全局方法
window._Fun = (a = "无") => {
  return '$Fun执行, 参数: ' + a
}
// 任意合法页面 1
// 检测 全局属性的 读
console.log(_name);  // dwp
console.log(_Fun()); // $Fun执行, 参数: 无
 _name = "DWPNB";


// 任意合法页面 2
console.log(_name);  // DWPNB
console.log(_Fun()); // $Fun执行, 参数: 无

结论:

查: 无论是获取变量值, 还是执行方法 都是ok的
改: 只要是被修改了, 在这个项目中无论那个位置获取这个值, 都是被修改的值

window._xxxx 就是相等于, 定义了一个变量,

但是这个变量无法直接渲染到项目, 同时也过于灵活。
不建议这样使用

方法三 (vuex) 推荐

这是关于vuex的简绍使用
https://blog.youkuaiyun.com/dwp_wz/article/details/107976732
vuex就不过多介绍了, 会的人 自然会 不会的 看完我写的 也会用了

### Vue3 中设置和使用全局变量的方法 在 Vue3 中,可以通过 `app.config.globalProperties` 来设置全局变量或方法。这种方式类似于 Vue2 的 `Vue.prototype`,但实现方式有所不同。 #### 设置全局变量Vue3 中,创建应用实例时可以配置全局属性。以下是具体操作: ```javascript import { createApp } from 'vue'; const app = createApp(App); // 定义全局变量 $systemId app.config.globalProperties.$systemId = "10"; // 定义全局方法 $logMessage app.config.globalProperties.$logMessage = function(message) { console.log('Global Log:', message); }; ``` 以上代码中,在 `app.config.globalProperties` 上设置了两个全局对象:一个是字符串类型的 `$systemId`[^1],另一个是函数类型的 `$logMessage`[^2]。 #### 使用全局变量 在组件内部访问这些全局变量的方式取决于使用的 API 风格(Options API 或 Composition API)。 ##### Options API 如果使用的是 Options API,则可以直接通过 `this.` 访问全局变量或方法: ```javascript export default { mounted() { console.log(this.$systemId); // 输出: 10 this.$logMessage('Hello, world!'); // 控制台显示: Global Log: Hello, world! } } ``` ##### Composition API 如果是基于 Composition API 的场景(如 `<script setup>`),由于无法直接访问 `this`,需要借助 `getCurrentInstance()` 获取当前实例上下文: ```typescript <script lang="ts" setup> import { getCurrentInstance } from 'vue'; const instance = getCurrentInstance(); if (instance) { const systemId = instance.appContext.config.globalProperties.$systemId; console.log(systemId); // 输出: 10 const logMessage = instance.appContext.config.globalProperties.$logMessage; logMessage('Composition API Test'); } </script> ``` 此处利用了 `getCurrentInstance().appContext.config.globalProperties` 来获取全局变量和方法。 --- #### 另一种方法:Provide/Inject 除了通过 `globalProperties` 设置全局变量外,还可以使用 Vue 提供的依赖注入机制——`provide/inject`。这种方法更适合局部共享数据而非完全意义上的“全局”。 **提供者端** ```javascript import { provide } from 'vue'; export default { setup() { provide('message', 'This is a provided value.'); } } ``` **消费者端** ```javascript import { inject } from 'vue'; export default { setup() { const injectedValue = inject('message'); console.log(injectedValue); // 输出: This is a provided value. } } ``` 此方法适用于父子组件间的数据传递,灵活性较高[^3]。 --- #### Uni-app 场景下的特殊处理 对于 uni-app 环境中的 Vue3 应用,也可以通过 `globalData` 实现跨页面通信的功能。例如: **定义全局数据** ```javascript export default { globalData: { userInfo: null, token: '' }, onLaunch() { this.globalData.token = 'abc123'; // 初始化全局数据 } } function getApp() { return new Promise((resolve) => resolve(getCurrentPages()[0].$getApp())); } ``` **调用全局数据** ```javascript async function fetchToken() { const app = await getApp(); console.log(app.globalData.token); // 输出: abc123 } fetchToken(); ``` 这种方案适合小型项目或者特定框架环境下的需求[^4]。 --- ### 总结 Vue3 支持多种方式设置和使用全局变量,其中最常见的是通过 `app.config.globalProperties` 和 `provide/inject`。前者更接近传统意义的全局变量管理,后者则提供了更加灵活的作用域控制能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厚渡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值