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

相关推荐
musk12123 分钟前
electron 打包太大 试试 tauri , tauri 安装打包demo
前端·electron·tauri
翻滚吧键盘32 分钟前
js代码09
开发语言·javascript·ecmascript
万少1 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
OpenGL1 小时前
Android targetSdkVersion升级至35(Android15)相关问题
前端
rzl021 小时前
java web5(黑马)
java·开发语言·前端
Amy.Wang1 小时前
前端如何实现电子签名
前端·javascript·html5
海天胜景1 小时前
vue3 el-table 行筛选 设置为单选
javascript·vue.js·elementui
今天又在摸鱼1 小时前
Vue3-组件化-Vue核心思想之一
前端·javascript·vue.js
蓝婷儿1 小时前
每天一个前端小知识 Day 21 - 浏览器兼容性与 Polyfill 策略
前端
百锦再2 小时前
Vue中对象赋值问题:对象引用被保留,仅部分属性被覆盖
前端·javascript·vue.js·vue·web·reactive·ref