【Vue】Vue2/3全局属性配置全攻略

Vue2 与 Vue3 全局属性/方法配置指南

Vue2 实现方案

1. 原型链挂载

javascript 复制代码
// main.js
import Vue from 'vue'
import App from './App.vue'

Vue.prototype.$formatDate = (timestamp) => {
  return new Date(timestamp).toLocaleString()
}

new Vue({
  render: h => h(App)
}).$mount('#app')

2. 组件中使用

javascript 复制代码
export default {
  mounted() {
    const formatted = this.$formatDate(Date.now())
    console.log(formatted) // 输出当前时间的格式化字符串
  }
}

3. TypeScript 支持

typescript 复制代码
// shims-vue.d.ts
declare module 'vue/types/vue' {
  interface Vue {
    $formatDate: (timestamp: number) => string
  }
}

4. 插件形式

javascript 复制代码
// plugins/format.js
export default {
  install(Vue) {
    Vue.prototype.$formatDate = (timestamp) => {
      return new Date(timestamp).toLocaleString()
    }
  }
}

// main.js
import FormatPlugin from './plugins/format'
Vue.use(FormatPlugin)
Vue3 实现方案

1. 全局属性配置

javascript 复制代码
// main.js
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

app.config.globalProperties.$formatDate = (timestamp) => {
  return new Date(timestamp).toLocaleString()
}

app.mount('#app')

2. 组件中使用

javascript 复制代码
// 选项式API
export default {
  mounted() {
    const formatted = this.$formatDate(Date.now())
    console.log(formatted)
  }
}

// 组合式API
import { getCurrentInstance } from 'vue'

export default {
  setup() {
    const { proxy } = getCurrentInstance()
    const formatted = proxy?.$formatDate(Date.now())
    return { formatted }
  }
}

3. TypeScript 支持

typescript 复制代码
// global.d.ts
import { ComponentCustomProperties } from 'vue'

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $formatDate: (timestamp: number) => string
  }
}

4. 插件形式

javascript 复制代码
// plugins/format.js
export default {
  install(app) {
    app.config.globalProperties.$formatDate = (timestamp) => {
      return new Date(timestamp).toLocaleString()
    }
  }
}

// main.js
import formatPlugin from './plugins/format'
app.use(formatPlugin)
关键差异对比表
特性 Vue2 Vue3
挂载方式 Vue.prototype app.config.globalProperties
类型声明文件 shims-vue.d.ts global.d.ts
组合式API访问 不适用 通过getCurrentInstance().proxy
插件安装参数 Vue构造函数 app实例
类型扩展接口 Vue interface ComponentCustomProperties
注意事项
  1. 命名冲突 :始终使用$前缀避免与组件属性冲突
  2. 响应性:挂载的属性默认不是响应式的,需要自行处理
  3. 组合式API:建议优先使用provide/inject进行组件通信
  4. 安全访问 :组合式API中需处理getCurrentInstance()可能为null的情况
  5. 版本兼容:Vue3的globalProperties在2.7+版本也可用,但建议使用对应版本方案

最佳实践建议

  • 简单工具方法使用全局属性
  • 复杂逻辑建议使用Composable函数(Vue3)或Mixin(Vue2)
  • 优先考虑按需引入而非全局挂载
  • 重要功能建议封装为插件提高可维护性
    在 Vue.js 中,如果你想在组件中通过 $ 符号访问在 main.js 中挂载到 Vue 原型上的方法或属性,可以按照以下步骤操作:

1. 在 main.js 中挂载属性或方法

main.js 文件中,你可以通过 Vue.prototype 添加全局属性或方法。例如:

javascript 复制代码
import Vue from 'vue'
import App from './App.vue'

// 在 Vue 原型上挂载一个方法或属性
Vue.prototype.$myGlobalMethod = function() {
  console.log('这是一个全局方法')
}

Vue.prototype.$myGlobalVariable = '这是一个全局变量'

new Vue({
  render: h => h(App),
}).$mount('#app')

2. 在组件中使用 $ 访问

在组件中,你可以直接通过 this.$myGlobalMethodthis.$myGlobalVariable 访问这些全局属性或方法:

javascript 复制代码
export default {
  name: 'MyComponent',
  created() {
    // 调用全局方法
    this.$myGlobalMethod() // 输出: 这是一个全局方法
    
    // 访问全局变量
    console.log(this.$myGlobalVariable) // 输出: 这是一个全局变量
  }
}

3. 注意事项

  • 命名规范 :通常全局属性和方法以 $ 开头,以避免与组件自身的属性和方法冲突。
  • TypeScript 支持 :如果你使用 TypeScript,需要扩展 Vue 的类型定义。可以在 src/shims-vue.d.ts 文件中添加:
typescript 复制代码
import Vue from 'vue'

declare module 'vue/types/vue' {
  interface Vue {
    $myGlobalMethod: () => void
    $myGlobalVariable: string
  }
}

4. 替代方案(插件方式)

你也可以通过 Vue 插件的方式注入全局属性和方法:

javascript 复制代码
// myPlugin.js
export default {
  install(Vue) {
    Vue.prototype.$myGlobalMethod = function() {
      console.log('这是一个全局方法')
    }
    Vue.prototype.$myGlobalVariable = '这是一个全局变量'
  }
}

然后在 main.js 中使用插件:

javascript 复制代码
import Vue from 'vue'
import App from './App.vue'
import myPlugin from './myPlugin'

Vue.use(myPlugin)

new Vue({
  render: h => h(App),
}).$mount('#app')

这样你就可以在任何组件中通过 this.$myGlobalMethodthis.$myGlobalVariable 访问这些全局属性和方法了。作:

1. 在 main.js 中挂载属性或方法

main.js 文件中,你可以通过 Vue.prototype 添加全局属性或方法。例如:

javascript 复制代码
import Vue from 'vue'
import App from './App.vue'

// 在 Vue 原型上挂载一个方法或属性
Vue.prototype.$myGlobalMethod = function() {
  console.log('这是一个全局方法')
}

Vue.prototype.$myGlobalVariable = '这是一个全局变量'

new Vue({
  render: h => h(App),
}).$mount('#app')

2. 在组件中使用 $ 访问

在组件中,你可以直接通过 this.$myGlobalMethodthis.$myGlobalVariable 访问这些全局属性或方法:

javascript 复制代码
export default {
  name: 'MyComponent',
  created() {
    // 调用全局方法
    this.$myGlobalMethod() // 输出: 这是一个全局方法
    
    // 访问全局变量
    console.log(this.$myGlobalVariable) // 输出: 这是一个全局变量
  }
}

3. 注意事项

  • 命名规范 :通常全局属性和方法以 $ 开头,以避免与组件自身的属性和方法冲突。
  • TypeScript 支持 :如果你使用 TypeScript,需要扩展 Vue 的类型定义。可以在 src/shims-vue.d.ts 文件中添加:
typescript 复制代码
import Vue from 'vue'

declare module 'vue/types/vue' {
  interface Vue {
    $myGlobalMethod: () => void
    $myGlobalVariable: string
  }
}

4. 替代方案(插件方式)

你也可以通过 Vue 插件的方式注入全局属性和方法:

javascript 复制代码
// myPlugin.js
export default {
  install(Vue) {
    Vue.prototype.$myGlobalMethod = function() {
      console.log('这是一个全局方法')
    }
    Vue.prototype.$myGlobalVariable = '这是一个全局变量'
  }
}

然后在 main.js 中使用插件:

javascript 复制代码
import Vue from 'vue'
import App from './App.vue'
import myPlugin from './myPlugin'

Vue.use(myPlugin)

new Vue({
  render: h => h(App),
}).$mount('#app')

这样你就可以在任何组件中通过 this.$myGlobalMethodthis.$myGlobalVariable 访问这些全局属性和方法了。

相关推荐
发现一只大呆瓜16 分钟前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
css趣多多33 分钟前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端
阔皮大师39 分钟前
INote轻量文本编辑器
java·javascript·python·c#
lbb 小魔仙39 分钟前
【HarmonyOS实战】React Native 表单实战:自定义 useReactHookForm 高性能验证
javascript·react native·react.js
_codemonster39 分钟前
Vue的三种使用方式对比
前端·javascript·vue.js
寻找奶酪的mouse40 分钟前
30岁技术人对职业和生活的思考
前端·后端·年终总结
梦想很大很大1 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
We་ct1 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
张3蜂1 小时前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring
无小道1 小时前
Qt——事件简单介绍
开发语言·前端·qt