抛弃陈旧写法,你的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,愿大家做更正确的引路人

相关推荐
QQ1__8115175156 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态6 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子6 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室6 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI6 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing6 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者6 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册6 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李6 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢6 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web