在 Vue 3 中,由于架构的变化,不再使用 Vue.prototype 来添加全局属性或方法。取而代之的是通过应用实例的 app.config.globalProperties 来实现类似功能。以下是具体解决方案:
app.config.globalProperties这是最直接的替代方案,用于添加全局属性或方法,使其在所有组件中可用。
创建应用实例:使用 createApp 创建应用。
设置全局属性:通过 app.config.globalProperties 添加属性或方法。
挂载应用:调用 app.mount() 挂载到 DOM。
javascriptimport { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)// 添加全局方法
app.config.globalProperties.$formatDate = (date) => {
return new Date(date).toLocaleDateString()
}// 添加全局变量
app.config.globalProperties.$appName = 'My Vue 3 App'
app.mount('#app')
<script>
export default {
mounted() {
console.log(this.$appName) // 输出: My Vue 3 App
console.log(this.$formatDate('2023-10-01')) // 输出格式化后的日期
}
}
</script>
provide/inject(可选)如果需要在特定组件树中共享数据,而不是全局共享,可以使用 provide 和 inject。
// main.js
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.provide('appName', 'My Vue 3 App') // 提供全局数据app.mount('#app')
<script>
import { inject } from 'vue'
export default {
setup() {
const appName = inject('appName')
return { appName }
}
}
</script>
对于可复用的逻辑,建议封装成 组合式函数,而不是依赖全局属性。
// composables/useFormatDate.js
export function useFormatDate() {
const formatDate = (date) => {
return new Date(date).toLocaleDateString()
}
return { formatDate }
}
<script>
import { useFormatDate } from '@/composables/useFormatDate'
export default {
setup() {
const { formatDate } = useFormatDate()
return { formatDate }
}
}
</script>
如果你使用 TypeScript,需要扩展 ComponentCustomProperties 类型声明,以避免类型错误。
src/shims-vue.d.ts):declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$formatDate: (date: string) => string $appName: string }
}
直接替代方案:使用 app.config.globalProperties 添加全局属性/方法。
类型安全:通过扩展 ComponentCustomProperties 支持 TypeScript。
更现代的方式:优先考虑组合式 API 或 provide/inject 实现逻辑复用。
这样既保持了 Vue 2 的相似用法,又符合 Vue 3 的最佳实践!