🎯Vue 3 少量全局数据共享的最佳实践(无需 Vuex/Pinia)

在 Vue 3 项目中,如果你只有很少的数据 需要全局共享,其实没必要引入 Vuex、Pinia 这类重量级状态管理库,完全可以用更简单的方式实现全局数据共享。下面我给你介绍几种常用且简洁的做法👇


1️⃣ 组合式 API + 单文件导出(推荐)

直接用 ref/reactive 在模块作用域创建全局响应式数据,然后导出即可。

示例:

js 复制代码
// src/globalState.js
import { ref, reactive } from 'vue'

// 全局响应式变量
export const globalCount = ref(0)
export const globalUser = reactive({ name: '张三', age: 18 })

在任意组件中直接引入使用:

js 复制代码
<script setup>
import { globalCount, globalUser } from '@/globalState'

function add() {
  globalCount.value++
  globalUser.age++
}
</script>

<template>
  <div>
    <p>全局计数:{{ globalCount }}</p>
    <p>全局用户:{{ globalUser.name }} - {{ globalUser.age }}</p>
    <button @click="add">增加</button>
  </div>
</template>

特点:

  • 🚀 简单、轻量、无依赖
  • 🔄 响应式,所有用到的组件都会自动更新

2️⃣ 自定义 Composable 封装

如果想要更灵活一点,可以封装成自定义 hooks(composable):

js 复制代码
// src/useGlobalData.js
import { ref } from 'vue'

const count = ref(0)

export function useGlobalData() {
  return { count }
}

组件中使用:

js 复制代码
<script setup>
import { useGlobalData } from '@/useGlobalData'
const { count } = useGlobalData()
</script>

3️⃣ 使用 provide/inject(适合父子/多级组件)

如果你的全局数据只需要在某个组件树下共享,可以用 Vue 的 provide/inject

js 复制代码
// App.vue
<script setup>
import { ref, provide } from 'vue'
const count = ref(0)
provide('globalCount', count)
</script>
js 复制代码
// 子组件
<script setup>
import { inject } from 'vue'
const count = inject('globalCount')
</script>

这种方式适合"局部全局",即只在某个组件树下共享。


4️⃣ 什么时候用 Pinia/Vuex?

  • 只有数据量较多业务复杂需要模块化管理时,才建议引入专门的状态管理库。
  • 少量全局数据,完全没必要!

🏆 总结

  • 全局数据很少时,直接用 ref/reactive 导出变量最简单!
  • 需要更复杂管理时再考虑 Pinia/Vuex。

📚 延伸阅读

相关推荐
aesthetician2 分钟前
Spotify 网页版前端技术全面解析
前端
咩图3 分钟前
Sketchup软件二次开发+Ruby+VisualStudioCode
java·前端·ruby
Можно15 分钟前
从零开始:Vue 框架安装全指南
前端·javascript·vue.js
蜗牛攻城狮41 分钟前
CSS中的 `dvh` 与 `vh`: 深入理解视口单位
前端·css
啥都不懂的小小白1 小时前
Shell脚本编程入门:从零基础到实战掌握
前端·shell
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue球鞋购物系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
东东5161 小时前
校园短期闲置资源置换平台 ssm+vue
java·前端·javascript·vue.js·毕业设计·毕设
qq_419854051 小时前
富文本编辑器
前端
悟能不能悟1 小时前
VUE的国际化,怎么实现
前端·javascript·vue.js
Mr Xu_1 小时前
解决 Vue + Axios 热更新导致响应拦截器重复注册的问题
前端·javascript·vue.js