【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 访问这些全局属性和方法了。

相关推荐
0思必得01 天前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
Misnice1 天前
Webpack、Vite、Rsbuild区别
前端·webpack·node.js
青茶3601 天前
php怎么实现订单接口状态轮询(二)
前端·php·接口
大橙子额1 天前
【解决报错】Cannot assign to read only property ‘exports‘ of object ‘#<Object>‘
前端·javascript·vue.js
WooaiJava1 天前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
LYFlied1 天前
从 Vue 到 React,再到 React Native:资深前端开发者的平滑过渡指南
vue.js·react native·react.js
爱喝白开水a1 天前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied1 天前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌411 天前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家1 天前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法