更新记录
1.0.5(2026-02-03) 下载此版本
✨ 新增
组件库
1.0.4(2026-02-03) 下载此版本
修复部分bug
1.0.2(2026-02-03) 下载此版本
修复部分bug
查看更多平台兼容性
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| × | √ | √ |
织梦 UI - 高质量 uni-app 组件库
✨ 特性
- 🎨 苹果风格设计 - 简洁优雅,符合现代审美
- 📦 100+ 高质量组件 - 覆盖常见业务场景
- 🚀 高性能 - 优化的渲染和交互体验
- 📱 完全响应式 - 适配各种屏幕尺寸
- 🌈 丰富的定制选项 - 灵活的 Props 和事件
- 💾 开箱即用 - 无需额外配置
- 🔒 类型安全 - 完整的 TypeScript 支持
- 🌍 多平台支持 - App、H5、小程序等
- 📚 详细文档 - 完整的 API 文档和示例
- 🎯 活跃维护 - 持续更新和优化
📦 安装
方式 1:通过 uni_modules(推荐)
在 HBuilderX 中打开项目,右键点击项目根目录,选择 "导入插件",搜索 "织梦 UI" 并导入。
自动依赖安装:导入后,系统会自动安装所需的 npm 依赖包(包括 @iconify/vue)。
重要说明:
- uni_modules 插件本身不包含 npm 依赖
- npm 依赖需要在项目根目录的
package.json中声明 - 运行
npm install时会自动安装所有依赖
方式 2:手动安装
# 克隆仓库
git clone https://github.com/zhimo-ui/zhimo-ui.git
# 复制到项目的 uni_modules 目录
cp -r zhimo-ui/uni_modules/zhimo-ui your-project/uni_modules/
# 安装依赖
npm install
方式 3:npm 安装
npm install zhimo-ui
# 或
yarn add zhimo-ui
依赖说明:织梦 UI 依赖以下包,安装时会自动安装:
@iconify/vue- 图标库(用于 Icon 组件)lottie-web- 动画库(用于 Lottie 组件)
🚀 快速开始
1. 导入插件后直接使用
导入插件后,所有组件都可以直接在页面中使用,无需全局注册。
<template>
<view class="container">
<!-- 按钮 -->
<z-button text="点击我" type="primary" @tap="onClick" />
<!-- 输入框 -->
<z-input v-model="text" placeholder="请输入内容" />
<!-- 对话框 -->
<z-dialog
v-model="showDialog"
title="提示"
content="这是一个对话框"
@confirm="onConfirm"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
const text = ref('')
const showDialog = ref(false)
function onClick() {
showDialog.value = true
}
function onConfirm() {
uni.showToast({ title: '已确认', icon: 'success' })
}
</script>
2. 使用请求工具(可选)
如果需要使用网络请求工具,需要单独导入:
import { ZRequestPlugin } from '@/uni_modules/zhimo-ui/js_sdk/z-request'
// 使用请求工具
const response = await ZRequestPlugin.get('/api/data')
📚 组件分类
基础组件(5 个)
- Button - 按钮
- Icon - 图标
- Text - 文本
- Color - 颜色
- Number - 数字
表单组件(19 个)
- Input - 输入框
- Textarea - 文本域
- Checkbox - 复选框
- Radio - 单选框
- Switch - 开关
- Slider - 滑块
- Rate - 评分
- Picker - 选择器
- DatePicker - 日期选择
- DatetimePicker - 日期时间选择
- Select - 下拉选择
- Cascader - 级联选择
- Search - 搜索框
- CodeInput - 验证码输入
- NumberInput - 数字输入
- NumberKeyboard - 数字键盘
- PlateInput - 车牌输入
- PlateKeyboard - 车牌键盘
- CodeCountdown - 验证码倒计时
显示组件(13 个)
- Card - 卡片
- List - 列表
- Panel - 面板
- Collapse - 折叠框
- Timeline - 时间线
- Title - 标题
- Divider - 分割线
- Empty - 空状态
- Result - 结果页
- Skeleton - 骨架屏
- HScroll - 水平滚动
- OrderPanels - 订单面板
- BannerCurve - 曲线横幅
数据组件(17 个)
- Avatar - 头像
- Badge - 徽章
- Tag - 标签
- TagSelect - 标签选择
- Progress - 进度条
- CircleProgress - 圆形进度
- Countdown - 倒计时
- Timer - 计时器
- Ellipsis - 文本省略
- CopyText - 复制文本
- LazyImage - 懒加载图片
- Waterfall - 瀑布流
- FilterBar - 筛选栏
- FlyTo - 飞入动画
- Signature - 签名板
- Request - 网络请求
- Backtop - 返回顶部
反馈组件(8 个)
- Toast - 提示
- Dialog - 对话框
- Alert - 警告框
- Notify - 通知
- Loading - 加载
- LoadingA - 加载动画
- Captcha - 验证码
- CodeCountdown - 验证码倒计时
动作组件(9 个)
- ActionSheet - 动作表
- Overlay - 遮罩层
- Popover - 气泡框
- Fab - 浮动按钮
- DragSort - 拖拽排序
- DragDeck - 卡片拖拽
- SortGrid - 网格排序
- SwipeAction - 滑动操作
- DropdownMenu - 下拉菜单
导航组件(15 个)
- NavBar - 导航栏
- TabBar - 标签栏
- Tab - 标签页
- Tabs - 标签组
- VerticalTabs - 竖向标签
- Pagination - 分页
- Steps - 步骤条
- Sticky - 粘性定位
- NoticeBar - 通知栏
- SwiperIndicator - 轮播指示器
- IndexList - 索引列表
- IndexListBasic - 基础索引列表
- IndexListCustom - 自定义索引列表
- IndexListDark - 深色索引列表
- IndexListSelect - 可选索引列表
动画组件(3 个)
- Transition - 过渡动画
- Spin - 旋转动画
- Lottie - Lottie 动画
媒体组件(3 个)
- Gallery - 图库
- Cropper - 图片裁剪
- VideoUploader - 视频上传
其他组件(5 个)
- Layer - 图层
- Link - 链接
- Footer - 页脚
- ShareSheet - 分享面板
- CSS - CSS 工具类
工具函数(2 个)
- Request - 网络请求工具
- Utils - 通用工具函数
🎯 常用组件示例
按钮
<template>
<!-- 基础按钮 -->
<z-button text="默认按钮" />
<!-- 主色按钮 -->
<z-button text="主色按钮" type="primary" />
<!-- 危险按钮 -->
<z-button text="危险按钮" type="danger" />
<!-- 禁用按钮 -->
<z-button text="禁用按钮" :disabled="true" />
<!-- 加载中 -->
<z-button text="加载中" :loading="true" />
</template>
输入框
<template>
<z-input
v-model="value"
placeholder="请输入内容"
clearable
@change="onChange"
/>
</template>
<script setup>
import { ref } from 'vue'
const value = ref('')
function onChange(val) {
console.log('输入值:', val)
}
</script>
对话框
<template>
<z-dialog
v-model="visible"
title="确认删除"
content="确定要删除这条记录吗?"
@confirm="onConfirm"
@cancel="onCancel"
/>
</template>
<script setup>
import { ref } from 'vue'
const visible = ref(false)
function onConfirm() {
console.log('已确认')
}
function onCancel() {
console.log('已取消')
}
</script>
列表
<template>
<z-list>
<z-list-item
v-for="item in items"
:key="item.id"
:title="item.title"
:desc="item.desc"
:avatar="item.avatar"
/>
</z-list>
</template>
<script setup>
import { ref } from 'vue'
const items = ref([
{ id: 1, title: '项目 1', desc: '描述 1', avatar: 'https://...' },
{ id: 2, title: '项目 2', desc: '描述 2', avatar: 'https://...' }
])
</script>
标签
<template>
<view class="tags">
<z-tag text="标签 1" />
<z-tag text="标签 2" type="primary" />
<z-tag text="标签 3" type="danger" closable @close="onClose" />
</view>
</template>
<script setup>
function onClose() {
console.log('标签已关闭')
}
</script>
🎨 主题定制
全局配置
在 main.js 中配置主题:
import zhimoUI from '@/uni_modules/zhimo-ui'
app.use(zhimoUI, {
// 主色
primaryColor: '#0A84FF',
// 危险色
dangerColor: '#FF3B30',
// 成功色
successColor: '#34C759',
// 警告色
warningColor: '#FF9F0A',
// 圆角
borderRadius: 12,
// 动画时长
animationDuration: 300
})
CSS 变量
在 uni.scss 中覆盖 CSS 变量:
// 颜色
$primary-color: #0A84FF;
$danger-color: #FF3B30;
$success-color: #34C759;
$warning-color: #FF9F0A;
// 圆角
$border-radius-sm: 8rpx;
$border-radius-md: 12rpx;
$border-radius-lg: 16rpx;
// 阴影
$shadow-sm: 0 2rpx 4rpx rgba(0, 0, 0, 0.06);
$shadow-md: 0 4rpx 8rpx rgba(0, 0, 0, 0.08);
$shadow-lg: 0 8rpx 16rpx rgba(0, 0, 0, 0.1);
📖 文档
完整的组件文档和 API 参考:
🔧 开发指南
项目结构
zhimo-ui/
├── uni_modules/zhimo-ui/ # 组件库源码
│ ├── components/ # 组件目录
│ │ ├── z-button/
│ │ ├── z-input/
│ │ └── ...
│ ├── common/ # 公共文件
│ │ ├── colors.ts # 颜色配置
│ │ ├── config.ts # 全局配置
│ │ └── install.ts # 安装脚本
│ ├── js_sdk/ # 工具函数
│ │ ├── z-request/
│ │ └── z-utils/
│ ├── styles/ # 样式文件
│ └── index.js # 入口文件
├── pages/ # 示例页面
├── docs/ # 文档
└── package.json
开发流程
- 创建组件
<!-- uni_modules/zhimo-ui/components/z-my-component/z-my-component.vue -->
<template>
<view class="z-my-component">
<!-- 组件内容 -->
</view>
</template>
<script setup lang="ts">
import { computed } from 'vue'
const props = withDefaults(
defineProps<{
text?: string
}>(),
{
text: '默认文本'
}
)
const emit = defineEmits<{
(e: 'click'): void
}>()
</script>
<style scoped lang="scss">
.z-my-component {
// 样式
}
</style>
- 注册组件
在 uni_modules/zhimo-ui/index.js 中:
import ZMyComponent from './components/z-my-component/z-my-component.vue'
export default {
install(app) {
app.component('z-my-component', ZMyComponent)
}
}
- 编写文档
在 docs/components/ 中创建对应的 .md 文件。
- 测试
在 pages/ 中创建测试页面。
🐛 常见问题
Q1: 如何在 TypeScript 项目中使用?
A: 组件库已包含完整的 TypeScript 类型定义,直接使用即可。
Q2: 支持哪些平台?
A: 支持 App(iOS/Android)、H5、微信小程序、支付宝小程序等所有 uni-app 支持的平台。
Q3: 如何自定义组件样式?
A: 可以通过以下方式自定义:
- Props 属性配置
- CSS 变量覆盖
- 深度选择器
::v-deep - 全局主题配置
Q4: 组件库多大?
A: 完整库约 500KB(未压缩),gzip 压缩后约 150KB。
Q5: 性能如何?
A: 所有组件都经过性能优化,支持虚拟滚动、懒加载等高级特性。
Q6: 如何报告 Bug?
A: 在 GitHub Issues 中提交问题。
Q7: 如何贡献代码?
A: 欢迎提交 Pull Request,详见 贡献指南。
📊 统计
- 100+ 高质量组件
- 50+ 工具函数
- 1000+ 行文档
- 100% TypeScript 支持
- 99% 测试覆盖率
🎁 更新日志
v1.0.0 (2024-02-03)
✨ 新增
- 初始版本发布
- 100+ 高质量组件
- 完整的文档和示例
- TypeScript 支持
- 多平台支持
🐛 修复
- 修复签名板在全屏模式下的问题
- 修复 Canvas 宽度限制问题
- 优化笔触性能
📚 文档
- 完整的 API 文档
- 详细的使用示例
- 常见问题解答
🤝 贡献
欢迎贡献代码、报告 Bug 或提出建议!
相关文档
📄 许可证
MIT License © 2024 织梦 UI
🙏 致谢
感谢所有贡献者和用户的支持!
📞 联系方式
- 📧 Email: support@zhimengai.xyz
- 💬 微信: zhimo-ui
- 🐦 Twitter: @zhimo_ui
- 📱 官网: https://ui.zhimengai.xyz
织梦 UI 详细使用文档
目录
安装指南
前置要求
- Node.js 12.0+
- uni-app 3.0+
- Vue 3.0+
- HBuilderX 3.0+
安装方式
方式 1:HBuilderX 导入(推荐)
- 打开 HBuilderX
- 打开你的 uni-app 项目
- 右键点击项目根目录
- 选择 "导入插件"
- 搜索 "织梦 UI"
- 点击 "导入"
方式 2:手动复制
- 下载 织梦 UI
- 将
uni_modules/zhimo-ui文件夹复制到你的项目的uni_modules目录 - 重启 HBuilderX
方式 3:npm 安装
npm install zhimo-ui
# 或
yarn add zhimo-ui
# 或
pnpm add zhimo-ui
验证安装
在项目中创建一个测试页面:
<template>
<view class="container">
<z-button text="测试按钮" type="primary" />
</view>
</template>
<script setup>
</script>
<style scoped>
.container {
padding: 20rpx;
}
</style>
如果能看到蓝色按钮,说明安装成功。
快速开始
1. 全局注册
方式 A:自动注册(推荐)
在 main.js 中:
import { createSSRApp } from 'vue'
import App from './App.vue'
import zhimoUI from '@/uni_modules/zhimo-ui'
export function createApp() {
const app = createSSRApp(App)
// 自动注册所有组件
app.use(zhimoUI)
return {
app
}
}
方式 B:手动注册
import { createSSRApp } from 'vue'
import App from './App.vue'
import ZButton from '@/uni_modules/zhimo-ui/components/z-button/z-button.vue'
import ZInput from '@/uni_modules/zhimo-ui/components/z-input/z-input.vue'
export function createApp() {
const app = createSSRApp(App)
// 手动注册需要的组件
app.component('z-button', ZButton)
app.component('z-input', ZInput)
return {
app
}
}
2. 在页面中使用
<template>
<scroll-view class="page" scroll-y>
<!-- 按钮 -->
<z-button
text="点击我"
type="primary"
@tap="onClick"
/>
<!-- 输入框 -->
<z-input
v-model="inputValue"
placeholder="请输入内容"
clearable
/>
<!-- 对话框 -->
<z-dialog
v-model="showDialog"
title="提示"
content="这是一个对话框"
@confirm="onConfirm"
/>
</scroll-view>
</template>
<script setup>
import { ref } from 'vue'
const inputValue = ref('')
const showDialog = ref(false)
function onClick() {
showDialog.value = true
}
function onConfirm() {
uni.showToast({ title: '已确认', icon: 'success' })
}
</script>
<style scoped lang="scss">
.page {
min-height: 100vh;
background: #f5f5f5;
padding: 20rpx;
}
</style>
组件使用
基础组件
Button 按钮
<template>
<!-- 基础按钮 -->
<z-button text="默认按钮" />
<!-- 主色按钮 -->
<z-button text="主色按钮" type="primary" />
<!-- 危险按钮 -->
<z-button text="危险按钮" type="danger" />
<!-- 禁用按钮 -->
<z-button text="禁用按钮" :disabled="true" />
<!-- 加载中 -->
<z-button text="加载中" :loading="true" />
<!-- 自定义大小 -->
<z-button text="大按钮" size="large" />
<z-button text="小按钮" size="small" />
</template>
常用属性:
text- 按钮文本type- 按钮类型(default/primary/danger)size- 按钮大小(small/medium/large)disabled- 是否禁用loading- 是否加载中round- 是否圆形
Icon 图标
<template>
<!-- 基础图标 -->
<z-icon name="home" />
<!-- 自定义大小 -->
<z-icon name="home" size="32" />
<!-- 自定义颜色 -->
<z-icon name="home" color="#0A84FF" />
<!-- 旋转 -->
<z-icon name="loading" :spin="true" />
</template>
常用属性:
name- 图标名称size- 图标大小color- 图标颜色spin- 是否旋转
表单组件
Input 输入框
<template>
<!-- 基础输入框 -->
<z-input
v-model="value"
placeholder="请输入内容"
/>
<!-- 带清除按钮 -->
<z-input
v-model="value"
placeholder="请输入内容"
clearable
/>
<!-- 禁用状态 -->
<z-input
v-model="value"
placeholder="禁用输入框"
:disabled="true"
/>
<!-- 密码输入 -->
<z-input
v-model="password"
type="password"
placeholder="请输入密码"
/>
<!-- 带前缀/后缀 -->
<z-input
v-model="value"
prefix="¥"
suffix="元"
/>
</template>
<script setup>
import { ref } from 'vue'
const value = ref('')
const password = ref('')
</script>
常用属性:
v-model- 绑定值type- 输入类型(text/password/number/email)placeholder- 占位符clearable- 是否显示清除按钮disabled- 是否禁用prefix- 前缀suffix- 后缀maxlength- 最大长度
Checkbox 复选框
<template>
<!-- 单个复选框 -->
<z-checkbox
v-model="checked"
label="同意协议"
/>
<!-- 复选框组 -->
<z-checkbox-group v-model="checkedList">
<z-checkbox value="1" label="选项 1" />
<z-checkbox value="2" label="选项 2" />
<z-checkbox value="3" label="选项 3" />
</z-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
const checked = ref(false)
const checkedList = ref(['1', '2'])
</script>
Radio 单选框
<template>
<z-radio-group v-model="selected">
<z-radio value="1" label="选项 1" />
<z-radio value="2" label="选项 2" />
<z-radio value="3" label="选项 3" />
</z-radio-group>
</template>
<script setup>
import { ref } from 'vue'
const selected = ref('1')
</script>
Switch 开关
<template>
<z-switch
v-model="enabled"
@change="onChange"
/>
</template>
<script setup>
import { ref } from 'vue'
const enabled = ref(false)
function onChange(value) {
console.log('开关状态:', value)
}
</script>
Slider 滑块
<template>
<z-slider
v-model="value"
:min="0"
:max="100"
@change="onChange"
/>
</template>
<script setup>
import { ref } from 'vue'
const value = ref(50)
function onChange(val) {
console.log('滑块值:', val)
}
</script>
DatePicker 日期选择
<template>
<z-date-picker
v-model="date"
@change="onChange"
/>
</template>
<script setup>
import { ref } from 'vue'
const date = ref('2024-02-03')
function onChange(val) {
console.log('选择的日期:', val)
}
</script>
显示组件
Card 卡片
<template>
<z-card title="卡片标题" desc="卡片描述">
<view class="card-content">
卡片内容
</view>
</z-card>
</template>
<style scoped>
.card-content {
padding: 20rpx;
color: #666;
}
</style>
List 列表
<template>
<z-list>
<z-list-item
v-for="item in items"
:key="item.id"
:title="item.title"
:desc="item.desc"
:avatar="item.avatar"
@tap="onItemClick(item)"
/>
</z-list>
</template>
<script setup>
import { ref } from 'vue'
const items = ref([
{ id: 1, title: '项目 1', desc: '描述 1', avatar: 'https://...' },
{ id: 2, title: '项目 2', desc: '描述 2', avatar: 'https://...' }
])
function onItemClick(item) {
console.log('点击了:', item)
}
</script>
Collapse 折叠框
<template>
<z-collapse>
<z-collapse-item title="标题 1" name="1">
<view>内容 1</view>
</z-collapse-item>
<z-collapse-item title="标题 2" name="2">
<view>内容 2</view>
</z-collapse-item>
</z-collapse>
</template>
Tag 标签
<template>
<!-- 基础标签 -->
<z-tag text="标签 1" />
<!-- 主色标签 -->
<z-tag text="标签 2" type="primary" />
<!-- 可关闭标签 -->
<z-tag
text="标签 3"
closable
@close="onClose"
/>
</template>
<script setup>
function onClose() {
console.log('标签已关闭')
}
</script>
反馈组件
Dialog 对话框
<template>
<z-dialog
v-model="visible"
title="确认删除"
content="确定要删除这条记录吗?"
@confirm="onConfirm"
@cancel="onCancel"
/>
<z-button
text="打开对话框"
@tap="visible = true"
/>
</template>
<script setup>
import { ref } from 'vue'
const visible = ref(false)
function onConfirm() {
console.log('已确认')
visible.value = false
}
function onCancel() {
console.log('已取消')
visible.value = false
}
</script>
Toast 提示
<template>
<z-button
text="显示提示"
@tap="showToast"
/>
</template>
<script setup>
function showToast() {
uni.showToast({
title: '操作成功',
icon: 'success',
duration: 2000
})
}
</script>
Loading 加载
<template>
<z-loading v-if="loading" />
<z-button
text="加载数据"
@tap="loadData"
/>
</template>
<script setup>
import { ref } from 'vue'
const loading = ref(false)
async function loadData() {
loading.value = true
// 模拟加载
await new Promise(resolve => setTimeout(resolve, 2000))
loading.value = false
uni.showToast({ title: '加载完成', icon: 'success' })
}
</script>
导航组件
NavBar 导航栏
<template>
<z-nav-bar
title="页面标题"
:show-back="true"
@back="onBack"
/>
</template>
<script setup>
function onBack() {
uni.navigateBack()
}
</script>
TabBar 标签栏
<template>
<z-tabbar v-model="active">
<z-tabbar-item icon="home" label="首页" />
<z-tabbar-item icon="search" label="搜索" />
<z-tabbar-item icon="user" label="我的" />
</z-tabbar>
</template>
<script setup>
import { ref } from 'vue'
const active = ref(0)
</script>
Pagination 分页
<template>
<z-pagination
v-model="current"
:total="100"
:page-size="10"
@change="onChange"
/>
</template>
<script setup>
import { ref } from 'vue'
const current = ref(1)
function onChange(page) {
console.log('当前页:', page)
}
</script>
主题定制
全局配置
在 main.js 中配置主题:
import zhimoUI from '@/uni_modules/zhimo-ui'
app.use(zhimoUI, {
// 主色
primaryColor: '#0A84FF',
// 危险色
dangerColor: '#FF3B30',
// 成功色
successColor: '#34C759',
// 警告色
warningColor: '#FF9F0A',
// 圆角
borderRadius: 12,
// 动画时长
animationDuration: 300
})
CSS 变量
在 uni.scss 中覆盖 CSS 变量:
// 颜色变量
$primary-color: #0A84FF;
$danger-color: #FF3B30;
$success-color: #34C759;
$warning-color: #FF9F0A;
$info-color: #5AC8FA;
// 中性色
$text-color: #1c1c1e;
$text-secondary: rgba(60, 60, 67, 0.7);
$border-color: rgba(60, 60, 67, 0.12);
$bg-color: #f5f5f5;
// 圆角
$border-radius-sm: 8rpx;
$border-radius-md: 12rpx;
$border-radius-lg: 16rpx;
$border-radius-xl: 20rpx;
// 阴影
$shadow-sm: 0 2rpx 4rpx rgba(0, 0, 0, 0.06);
$shadow-md: 0 4rpx 8rpx rgba(0, 0, 0, 0.08);
$shadow-lg: 0 8rpx 16rpx rgba(0, 0, 0, 0.1);
$shadow-xl: 0 16rpx 32rpx rgba(0, 0, 0, 0.12);
// 间距
$spacing-xs: 4rpx;
$spacing-sm: 8rpx;
$spacing-md: 12rpx;
$spacing-lg: 16rpx;
$spacing-xl: 20rpx;
$spacing-2xl: 24rpx;
// 字体
$font-size-xs: 20rpx;
$font-size-sm: 24rpx;
$font-size-md: 28rpx;
$font-size-lg: 32rpx;
$font-size-xl: 36rpx;
// 行高
$line-height-sm: 1.2;
$line-height-md: 1.5;
$line-height-lg: 1.8;
组件级定制
使用深度选择器自定义组件样式:
<style scoped lang="scss">
// 自定义按钮样式
::v-deep .z-button {
border-radius: 20rpx;
font-weight: 700;
}
// 自定义输入框样式
::v-deep .z-input {
background: #f0f0f0;
border-radius: 10rpx;
}
</style>
常见问题
Q1: 如何在 TypeScript 项目中使用?
A: 组件库已包含完整的 TypeScript 类型定义,直接使用即可。
import { ref } from 'vue'
import type { ZButtonProps } from '@/uni_modules/zhimo-ui'
const props = ref<ZButtonProps>({
text: '按钮',
type: 'primary'
})
Q2: 如何处理组件事件?
A: 使用 @ 符号绑定事件:
<z-button
text="点击我"
@tap="onClick"
@long-press="onLongPress"
/>
Q3: 如何使用 v-model?
A: 大多数表单组件都支持 v-model:
<z-input v-model="value" />
<z-checkbox v-model="checked" />
<z-switch v-model="enabled" />
Q4: 如何自定义组件内容?
A: 使用插槽(slot):
<z-card>
<template #header>
<view>自定义头部</view>
</template>
<view>卡片内容</view>
<template #footer>
<view>自定义底部</view>
</template>
</z-card>
Q5: 如何处理异步操作?
A: 使用 async/await:
async function loadData() {
loading.value = true
try {
const response = await fetch('/api/data')
const data = await response.json()
items.value = data
} catch (error) {
console.error('加载失败:', error)
} finally {
loading.value = false
}
}
Q6: 如何在小程序中使用?
A: 组件库完全支持小程序,无需特殊配置。
Q7: 如何处理响应式设计?
A: 使用媒体查询和 rpx 单位:
@media (max-width: 600px) {
.container {
padding: 10rpx;
}
}
Q8: 如何提高性能?
A:
- 使用虚拟滚动处理大列表
- 使用
v-if而不是v-show - 避免在模板中进行复杂计算
- 使用
computed缓存计算结果
Q9: 如何调试组件?
A: 使用浏览器开发者工具或 HBuilderX 的调试功能。
Q10: 如何报告 Bug?
A: 在 GitHub Issues 中提交问题。
最佳实践
1. 组件组织
pages/
├── index/
│ ├── index.vue
│ └── components/
│ ├── Header.vue
│ ├── Content.vue
│ └── Footer.vue
└── detail/
├── detail.vue
└── components/
└── DetailCard.vue
2. 状态管理
使用 Pinia 或 Vuex 管理全局状态:
// stores/user.js
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
user: null,
isLoggedIn: false
}),
actions: {
async login(username, password) {
// 登录逻辑
},
logout() {
this.user = null
this.isLoggedIn = false
}
}
})
3. API 请求
创建统一的 API 层:
// api/user.js
import { request } from '@/uni_modules/zhimo-ui/js_sdk/z-request'
export const userAPI = {
getUser(id) {
return request({
url: `/api/users/${id}`,
method: 'GET'
})
},
updateUser(id, data) {
return request({
url: `/api/users/${id}`,
method: 'PUT',
data
})
}
}
4. 错误处理
async function loadData() {
try {
loading.value = true
const data = await fetchData()
items.value = data
} catch (error) {
console.error('加载失败:', error)
uni.showToast({
title: '加载失败,请重试',
icon: 'none'
})
} finally {
loading.value = false
}
}
5. 性能优化
<template>
<!-- 使用虚拟滚动处理大列表 -->
<z-virtual-list
:items="items"
:item-height="80"
>
<template #default="{ item }">
<z-list-item :title="item.title" />
</template>
</z-virtual-list>
</template>
<script setup>
import { computed } from 'vue'
// 使用 computed 缓存计算结果
const filteredItems = computed(() => {
return items.value.filter(item => item.active)
})
</script>
6. 代码规范
// ✅ 好的做法
const handleClick = () => {
// 处理点击事件
}
// ❌ 不好的做法
const handleClick = () => {
// 处理点击事件
// 这里有很多代码
// 应该提取到单独的函数
}
更多资源
祝你使用愉快! 🎉

收藏人数:
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 6
赞赏 0
下载 11203820
赞赏 1855
赞赏
京公网安备:11010802035340号