uni-ui 必须通过 npm 安装并按需引入,不支持 CDN 或 script 引入;微信小程序需基础库 ≥2.27.0 才支持 CSS 变量;uni-popup 需 v-model 双向绑定且禁用 v-if;uni-datetime-picker 的 value 必须为毫秒时间戳。
uni-app 的 uni-ui 是一个基于 Vue 3(兼容 Vue 2)的跨端 UI 库,它不是内置模块,也不支持在 index.html 里通过 <script> 加载。所有组件都依赖 npm 包管理器完成注册和按需引入。
常见的报错表现:Unknown custom element: <uni-badge>、Component is not defined —— 原因基本都是没有安装,或 import 配置不正确。
npm install @dcloudio/uni-ui(推荐使用 npm,pnpm/yarn 在某些 HBuilderX 版本下有路径解析问题)Vue.use(uniUI),但实际使用时会让全部组件无条件打包进首屏,导致 JS 体积明显增加import { uniBadge } from '@dcloudio/uni-ui',随后在 components 选项中完成注册@dcloudio/uni-ui@next(当前默认),Vue 2 项目则需要锁定 @dcloudio/[email protected]
这是最容易被忽视的兼容性问题:uni-ui 默认通过 CSS 变量(--uni-color-primary 等)设置主题色,但微信小程序基础库版本低于 2.27.0 时无法支持原生 CSS 变量,因而会使样式 fallback 失效,并引发颜色或间距异常。
2.27.0
App.vue 的 <style> 中加入全局 CSS 变量声明,例如::root { --uni-color-primary: #007aff; --uni-spacing-row: 20rpx;}
uni.scss 中覆盖,因为它只影响编译期 Sass,不会改变运行时 CSS 变量uni-popup 是最容易出错的组件之一,主要原因是它依赖 v-model 控制显示与隐藏,但许多人把它当作普通组件直接固定写入 show 属性,或遗漏需要绑定的值。
<uni-popup v-model:show="popupVisible">(Vue 3)或 <uni-popup :show="popupVisible" @change="val => popupVisible = val">(Vue 2)v-if 控制它的挂载,因为 uni-popup 内部需要在 mounted 后执行 DOM 操作,而v-if 会打乱生命周期animation="true" 属性,否则在 iOS 微信中唤起软键盘时,弹窗位置会发生错乱onLoad 钩子中立即打开:部分平台(尤其是 App)需等页面渲染完成,建议延后一帧:setTimeout(() => this.popupVisible = true, 30)
uni-datetime-picker 的 value 属性要求接收时间戳,也就是毫秒数,而非字符串或 Date 对象;这正是大多数人出错的根源。
value="2024-05-20" 或 :value="new Date()" → 会直接失效,界面显示空白或默认使用当前时间:value="new Date('2024-05-20').getTime()" 或 :value="1716163200000"
String(new Date(timeStr).getTime())(需要注意:不能使用 parseInt,因为 Safari 解析 ISO 字符串的行为并不一致)uni.$u.timeFormat() 或 dayjs,别依赖浏览器 Date.prototype.toLocaleString(),各端表现差异大uni-calendar 的 insertDate 参数仅在第一次加载时有效,之后再修改也不会触发重绘;面对这类行为,必须查看源码或运行 demo 验证,不能只依赖文档说明。