抛弃陈旧写法,你的uniapp定义globalData的正确姿势(setup语法糖)

前言

这段时间在公司pnpm+monorepo开发项目的时候,发现一些公司内部组件库需要用到的存在一些主题色传导问题,最后决定使用uniapp提供的globalData,而搜索引擎提供的方案比较啰嗦古老且不优雅
请使用defineOptions解决globalData定义问题!

分析与试错

如图,很多项目都使用了这个内部组件库,且里面依赖了主题色,在我们的组件封装中用到了sass变量$xxx-color,我们的自己开发组件库我们可以通过scss/css变量处理,但是组件库依赖了线上开源的组件库,其组件(radio,switch...)之类的组件,是依赖color变量来改变颜色的

于是我总结了几种方案:

1.css变量

js 复制代码
// .scss
page{
    --xxx-color:$xxx-color
}
// .vue 内部组件库
<up-button color="var(--xxx-color)"></up-button>
<up-radio activeColor="var(--xxx-color)"></up-radio>

然而并没有很理想,一部分组件没问题,一部分有问题,所以使用css变量就排除了

2. 使用globalData

js 复制代码
// app.vue 搜索引擎例子
<script>
export default {
    globalData: { color: '#ccc' }
}
</script>
<script setup>
import { onLaunch } from '@dcloudio/uni-app'  
onLaunch(() => {}) 
</script>
// .vue 内部组件库
<up-button :color="color"></up-button>
<up-radio :activeColor="color"></up-radio>
const color=getApp().globalData.color

这样就可以统一一个变量,比起其他的设置颜色方式好多了

3. 使用本地存储(下策方案)

js 复制代码
// app.vue
uni.setStorageSync("xxx-color","#ccc")
// .vue 内部组件库
<up-button :color="color"></up-button>
<up-radio :activeColor="color"></up-radio>
const color=uni.getStorageSync("xxx-color")

跟使用globalData代码层面差不多,但是本地的读写肯定不如缓存直接拿

为什么不选择传参或者pinia之类的存储呢?(globalData搜索引擎给的其他方案)

  • 组件库颜色传参导致一到使用都得去看一下主题色变量对应的颜色
  • 公共组件库无法使用依赖项目的pinia缓存的变量(直接报错)

那搜索引擎给的都是vue2的写法,然后vue3 setup的语法,比较不优雅

官方给的也是vue2的例子

...

要么都是在错的基础上让别人转其他方案(vuex,pinia,provide-inject),要么就提供一些通过生命周期设置或者双script的写法

其他方案(vuex,pinia,provide-inject)不符合我的需求

通过生命周期或者双script,如果是在vue3.3之前我是双手支持的

吐槽一下,uniapp官方没有给出setup语法下的globalData正确定义用法,很多2024年开发者出的文章也是千篇一律的陈旧写法普及,没有丝毫营养,建议发文章的朋友慢慢看文档,自己提升的同时,让后来者得到更好的解决方式,而不是快餐式的复制

解决方式

来了它来了,defineOptions ,很重要的一句话:这个宏可以用来直接在 <script setup> 中声明组件选项,而不必使用单独的 <script>

js 复制代码
// app.vue
<script setup>
defineOptions({
  globalData: {
   color:"#ccc"
  }
})
... 其他内容
</script>
// .vue 内部组件库
<up-button :color="color"></up-button>
<up-radio :activeColor="color"></up-radio>
const color=uni.getStorageSync("xxx-color")
  1. 解决了双script代码不优雅及别扭
  2. 解决了需要使用生命周期设置值(亡羊补牢的方式)
  3. 符合公共组件库总结获取变量的方式

总结

写下这篇文章是想提供更好的更新的解决方式给后来者,vue3.3已经发布许久,这是一个很简单的知识点defineOptions,愿大家做更正确的引路人

相关推荐
LaughingZhu5 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫5 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux6 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水7 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger7 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)7 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态7 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态8 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart8 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe58 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架