更新记录

1.0.5(2026-02-03) 下载此版本

✨ 新增

组件库

1.0.4(2026-02-03) 下载此版本

修复部分bug

1.0.2(2026-02-03) 下载此版本

修复部分bug

查看更多

平台兼容性

其他

多语言 暗黑模式 宽屏模式
×

织梦 UI - 高质量 uni-app 组件库

![织梦 UI](https://img.shields.io/badge/织梦%20UI-v1.0.0-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![uni-app](https://img.shields.io/badge/uni--app-3.0%2B-orange) ![Vue](https://img.shields.io/badge/Vue-3.0%2B-brightgreen) **一个功能完整、设计精美的 uni-app 组件库,包含 100+ 高质量组件** [官网](https://ui.zhimengai.xyz) • [文档](https://ui.zhimengai.xyz/docs) • [示例](https://ui.zhimengai.xyz/examples) • [更新日志](./CHANGELOG.md) • [反馈](https://ui.zhimengai.xyz/issues)

✨ 特性

  • 🎨 苹果风格设计 - 简洁优雅,符合现代审美
  • 📦 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

开发流程

  1. 创建组件
<!-- 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>
  1. 注册组件

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)
  }
}
  1. 编写文档

docs/components/ 中创建对应的 .md 文件。

  1. 测试

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

**Made with ❤️ by 织梦 UI Team** [⬆ 回到顶部](#织梦-ui---高质量-uni-app-组件库)

织梦 UI 详细使用文档

目录

  1. 安装指南
  2. 快速开始
  3. 组件使用
  4. 主题定制
  5. 常见问题
  6. 最佳实践

安装指南

前置要求

  • Node.js 12.0+
  • uni-app 3.0+
  • Vue 3.0+
  • HBuilderX 3.0+

安装方式

方式 1:HBuilderX 导入(推荐)

  1. 打开 HBuilderX
  2. 打开你的 uni-app 项目
  3. 右键点击项目根目录
  4. 选择 "导入插件"
  5. 搜索 "织梦 UI"
  6. 点击 "导入"

方式 2:手动复制

  1. 下载 织梦 UI
  2. uni_modules/zhimo-ui 文件夹复制到你的项目的 uni_modules 目录
  3. 重启 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 = () => {
  // 处理点击事件
  // 这里有很多代码
  // 应该提取到单独的函数
}

更多资源


祝你使用愉快! 🎉

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议