🎯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。

📚 延伸阅读

相关推荐
袅沫10 分钟前
Nginx中部署多个前端项目——区分路径
服务器·前端
Asize15 分钟前
为什么写代码前要先规划组件树?Next.js + Redis 笔记系统实战
前端·javascript·next.js
用户9210802628619 分钟前
6. 数据大屏 WebSocket 稳定性优化:心跳检测、断点续传和消息去重
前端
柚yuzumi19 分钟前
CSS 定位布局:让元素各就各位
前端·css
光影少年22 分钟前
react navite图片加载优化、大图卡顿、缓存策略
前端·react native·react.js
小林ixn22 分钟前
用 Next.js 和 Redis 撸一个 Markdown 笔记系统:RSC 实战与组件化拆解
前端·redis·next.js
渣波24 分钟前
重构旅行体验:基于 React 的 AI 旅游助手对话系统实战解析
前端·javascript
今日无bug26 分钟前
列表转树:一道题搞懂 HashMap 在算法里的价值
前端·数据结构
用户9210802628626 分钟前
5. 数据大屏实时通信第一步:为什么选择 WebSocket,以及如何接入 Socket.IO
前端
岁月留痕16827 分钟前
17 实战项目二:实现“日记”项目多页面管理
前端