更新记录
1.0.0(2026-06-04)
1.0.0 2024-01-15 初始版本 1.1.0 2024-06-04 添加标签禁用状态、图片懒加载、点击反馈、按钮尺寸自定义、卡片背景色和边框样式自定义
平台兼容性
uni-app(3.7.8)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | - | - | - | - | - | - | - | - |
OrderManager 订单管理组件
简介
OrderManager 是一个基于 uni-app 框架 开发的高性能订单管理组件,集成了订单分类标签栏和订单列表展示功能。组件采用组件化架构设计,支持多店铺和单店铺两种展示模式,并提供丰富的自定义配置选项,能够快速适配各种订单管理场景。
功能特性
| 特性 | 说明 | 状态 |
|---|---|---|
| 订单分类标签 | 支持自定义标签列表,带有角标计数显示,支持禁用状态,可控制显示/隐藏 | ✅ |
| 多店铺模式 | 每个店铺一张订单卡片,展示店铺级别的订单信息 | ✅ |
| 单店铺模式 | 所有商品在一张卡片中展示,简化订单展示 | ✅ |
| 下拉刷新 | 支持下拉刷新订单列表,用户体验流畅 | ✅ |
| 上拉加载更多 | 支持滚动到底部自动加载更多订单 | ✅ |
| 字段映射 | 通过 fieldMap 属性支持自定义字段映射,适配不同接口返回的数据结构 |
✅ |
| 样式自定义 | 通过 styles 属性自定义各元素的字体大小和颜色 |
✅ |
| 自定义按钮 | 支持完全自定义订单操作按钮,按钮栏可控制显示/隐藏 | ✅ |
| 空状态展示 | 支持自定义空状态图标和提示文字 | ✅ |
| 动态高度 | 滚动区域高度根据是否显示标签栏自动计算 | ✅ |
| 图片懒加载 | 支持商品图片懒加载,提升页面性能 | ✅ |
| 点击反馈 | 按钮和商品卡片点击时有缩放和透明度变化效果 | ✅ |
设计理念
组件化架构
组件采用分层设计,职责清晰:
OrderManager(订单管理主组件)
├── OrderTabs(标签栏组件)
│ └── 负责订单分类切换、标签滚动、角标显示
├── OrderCard(订单卡片组件)
│ ├── 负责订单信息展示、商品列表渲染
│ └── OrderActions(操作按钮组件)
│ └── 负责操作按钮渲染和事件分发
└── NoData(空状态组件)
└── 负责无数据时的友好提示
核心设计原则
- 数据驱动:所有展示内容由数据驱动,通过
fieldMap实现字段映射 - 配置化:支持丰富的配置选项,满足不同业务需求
- 性能优化:支持图片懒加载、虚拟滚动(预留)
- 可扩展性:组件结构清晰,易于扩展和定制
快速开始
安装方式
方式一:手动引入
将组件目录复制到项目的 components 目录下,然后在页面中引入:
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:activeTab="activeTab"
@tabChange="handleTabChange"
@action="handleAction"
/>
</template>
<script>
import OrderManager from '@/components/OrderManager/OrderManager.vue'
export default {
components: {
OrderManager
}
}
</script>
方式二:npm 安装(待支持)
npm install @uni/order-manager --save
基本配置
在使用前,您需要准备以下数据:
// 1. 配置标签列表
const tabs = [
{ key: 0, label: '全部', count: 10 },
{ key: 1, label: '待付款', count: 3 },
{ key: 2, label: '待收货', count: 5 },
{ key: 3, label: '待评价', count: 2 },
{ key: 4, label: '已完成', count: 0 }
]
// 2. 准备订单数据
const orders = [
{
shopId: 'S001',
shopName: '服饰精品店',
status: 1,
statusText: '待付款',
createTime: '2024-01-15 10:30:00',
list: [
{
itemId: 'P001',
productName: '时尚T恤',
spec: 'M码/白色',
quantity: 2,
price: 99.9,
image: '/static/images/product1.jpg'
}
]
}
]
API 文档
Props 属性
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
tabs |
Array | 是 | - | 分类标签数据,支持 disabled 属性禁用标签 |
orders |
Array | 否 | [] |
订单列表数据 |
activeTab |
Number | 否 | 0 |
当前激活的标签索引 |
loading |
Boolean | 否 | false |
是否正在加载中 |
hasMore |
Boolean | 否 | true |
是否还有更多数据可加载 |
refreshing |
Boolean | 否 | false |
是否正在刷新 |
emptyIcon |
String | 否 | '' |
空状态图标地址 |
emptyText |
String | 否 | '暂无订单' |
空状态提示文字 |
isMultiShop |
Boolean | 否 | true |
是否为多店铺模式 |
showTabs |
Boolean | 否 | true |
是否显示标签栏 |
showActions |
Boolean | 否 | true |
是否显示操作按钮栏 |
lazyLoad |
Boolean | 否 | false |
是否启用图片懒加载 |
fieldMap |
Object | 否 | 默认映射 | 字段映射配置,适配不同接口字段 |
styles |
Object | 否 | {} |
自定义样式配置,包括颜色、字体大小等 |
buttons |
Array | 否 | [] |
自定义按钮列表,优先级高于默认按钮 |
tabs 属性说明
tabs: [
{ key: 0, label: '全部', count: 10 },
{ key: 1, label: '待付款', count: 3 },
{ key: 2, label: '待收货', count: 5 },
{ key: 3, label: '待评价', count: 2 },
{ key: 4, label: '已完成', count: 0 },
{ key: 5, label: '暂不可用', disabled: true } // 禁用状态
]
| 字段 | 类型 | 说明 |
|---|---|---|
key |
Number | 标签标识,对应订单状态 |
label |
String | 标签显示文字 |
count |
Number | 该状态的订单数量(用于角标显示) |
disabled |
Boolean | 是否禁用该标签(可选) |
fieldMap 属性说明
用于适配不同接口返回的字段名:
fieldMap: {
list: 'list', // 商品列表字段名
itemId: 'itemId', // 商品ID字段名
productName: 'productName', // 商品名称字段名
spec: 'spec', // 规格字段名
quantity: 'quantity', // 数量字段名
price: 'price', // 价格字段名
image: 'image', // 图片字段名
shopId: 'shopId', // 店铺ID字段名
shopName: 'shopName', // 店铺名称字段名
status: 'status', // 订单状态字段名
statusText: 'statusText', // 状态文本字段名
createTime: 'createTime' // 创建时间字段名
}
styles 属性说明
用于自定义各元素的样式:
styles: {
// 文字样式配置
shopName: { fontSize: '28rpx', color: '#333' }, // 店铺名称样式
shopTotal: { fontSize: '32rpx', color: '#ff5722' }, // 店铺订单总金额样式
shopCount: { fontSize: '24rpx', color: '#999' }, // 商品数量样式
shopTime: { fontSize: '24rpx', color: '#999' }, // 下单时间样式
productName: { fontSize: '26rpx', color: '#333' }, // 商品名称样式
productPrice: { fontSize: '24rpx', color: '#666' }, // 商品价格样式
productSubtotal: { fontSize: '28rpx', color: '#ff5722' }, // 小计金额样式
productStatus: { fontSize: '22rpx', color: '#ff5722' }, // 状态标签全局样式
productTime: { fontSize: '24rpx', color: '#999' }, // 下单时间样式(单店铺模式)
loadingText: { fontSize: '26rpx', color: '#999' }, // 加载提示样式
emptyText: { fontSize: '26rpx', color: '#999' }, // 空状态提示样式
// 背景色配置
cardBgColor: '#ffffff', // 卡片背景色
productRowBgColor: '#fafafa', // 商品行背景色
// 边框样式配置
borderColor: '#f0f0f0', // 边框颜色
borderStyle: 'solid', // 边框样式 (solid/dashed/dotted)
borderRadius: '16rpx', // 边框圆角
borderWidth: '2rpx', // 边框宽度
// 状态颜色配置
pendingColor: '#ff5722', // 待付款状态文字颜色
shippedColor: '#1989fa', // 待收货状态文字颜色
reviewColor: '#ff9500', // 待评价状态文字颜色
completedColor: '#666', // 已完成状态文字颜色
pendingBgColor: '', // 待付款状态背景颜色
shippedBgColor: '', // 待收货状态背景颜色
reviewBgColor: '', // 待评价状态背景颜色
completedBgColor: '', // 已完成状态背景颜色
// 标签栏样式配置
activeColor: '#ff5722', // 标签选中状态文字颜色
activeBgColor: '', // 标签选中状态背景颜色
activeBorderColor: '#ff5722', // 标签选中状态底部边框颜色
inactiveColor: '#666', // 标签未选中状态文字颜色
badgeBgColor: '#ff0000', // 标签角标背景颜色
badgeTextColor: '#ffffff', // 标签角标文字颜色
// 按钮样式配置
btnWidth: 148, // 按钮宽度(rpx)
btnHeight: 56, // 按钮高度(rpx)
cancelBtnColor: '#666', // 取消按钮文字颜色
cancelBtnBorderColor: '#ddd', // 取消按钮边框颜色
secondaryBtnColor: '#666', // 次要按钮文字颜色
secondaryBtnBorderColor: '#ddd', // 次要按钮边框颜色
primaryBtnBgColor: '#ff5722', // 主要按钮背景色
primaryBtnTextColor: '#fff' // 主要按钮文字颜色
}
buttons 属性说明
用于自定义订单操作按钮:
buttons: [
{ key: 'cancel', text: '取消订单', type: 'cancel' },
{ key: 'pay', text: '去付款', type: 'primary' },
{ key: 'logistics', text: '查看物流', type: 'secondary' },
{ key: 'confirm', text: '确认收货', type: 'primary' },
{ key: 'review', text: '评价', type: 'primary' },
{ key: 'refund', text: '申请退款', type: 'secondary' },
{ key: 'custom', text: '自定义按钮', type: 'secondary', width: 160, height: 60 }
]
| 字段 | 类型 | 说明 |
|---|---|---|
key |
String | 按钮标识,用于事件处理 |
text |
String | 按钮显示文字 |
type |
String | 按钮类型:cancel(取消按钮)、secondary(次要按钮)、primary(主要按钮) |
width |
Number | 按钮宽度(可选,单位 rpx) |
height |
Number | 按钮高度(可选,单位 rpx) |
按钮类型说明:
| 类型 | 样式 | 说明 |
|---|---|---|
cancel |
灰色边框,灰色文字 | 取消类按钮 |
secondary |
灰色边框,灰色文字 | 次要操作按钮 |
primary |
主色渐变背景,白色文字 | 主要操作按钮 |
Events 事件
| 事件名 | 参数 | 说明 |
|---|---|---|
tabChange |
key: Number |
标签切换时触发,返回选中的标签 key |
refresh |
- | 下拉刷新时触发 |
loadmore |
- | 上拉加载更多时触发 |
action |
key: String, data: Object |
操作按钮点击时触发 |
itemClick |
item: Object |
商品项点击时触发 |
状态与按钮映射
默认情况下,组件会根据订单状态自动显示对应的操作按钮:
| 状态码 | 状态名称 | 显示按钮 |
|---|---|---|
| 1 | 待付款 | 取消订单、去付款 |
| 2 | 待收货 | 查看物流、确认收货、申请退款 |
| 3 | 待评价 | 评价 |
| 4 | 已完成 | 无操作 |
| 5 | 待发货 | 取消订单 |
| 6 | 退款/售后 | 评价 |
使用示例
基础用法
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:activeTab="activeTab"
:loading="loading"
:hasMore="hasMore"
:refreshing="refreshing"
@tabChange="handleTabChange"
@refresh="handleRefresh"
@loadmore="handleLoadMore"
@action="handleAction"
@itemClick="handleItemClick"
/>
</template>
<script>
import OrderManager from '@/components/OrderManager/OrderManager.vue'
export default {
components: {
OrderManager
},
data() {
return {
tabs: [
{ key: 0, label: '全部', count: 0 },
{ key: 1, label: '待付款', count: 3 },
{ key: 2, label: '待收货', count: 2 },
{ key: 3, label: '待评价', count: 1 },
{ key: 4, label: '已完成', count: 5 }
],
orders: [],
activeTab: 0,
loading: false,
hasMore: true,
refreshing: false
}
},
methods: {
handleTabChange(key) {
this.activeTab = key
this.loadOrders()
},
handleRefresh() {
this.refreshing = true
this.loadOrders()
},
handleLoadMore() {
if (this.loading || !this.hasMore) return
this.loadMoreOrders()
},
handleAction(key, data) {
switch(key) {
case 'cancel':
uni.showToast({ title: `取消订单: ${data.shopId}`, icon: 'none' })
break
case 'pay':
uni.showToast({ title: `去付款: ${data.shopId}`, icon: 'none' })
break
case 'logistics':
uni.showToast({ title: `查看物流: ${data.shopId}`, icon: 'none' })
break
case 'confirm':
uni.showToast({ title: `确认收货: ${data.shopId}`, icon: 'none' })
break
case 'review':
uni.showToast({ title: `评价: ${data.shopId}`, icon: 'none' })
break
case 'refund':
uni.showToast({ title: `申请退款: ${data.shopId}`, icon: 'none' })
break
}
},
handleItemClick(item) {
uni.navigateTo({ url: `/pages/detail/index?id=${item.itemId}` })
},
loadOrders() {},
loadMoreOrders() {}
}
}
</script>
自定义按钮配置
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:buttons="customButtons"
@action="handleAction"
/>
</template>
<script>
export default {
data() {
return {
customButtons: [
{ key: 'pay', text: '立即支付', type: 'primary' },
{ key: 'confirm', text: '确认收货', type: 'primary' },
{ key: 'review', text: '去评价', type: 'secondary' }
]
}
},
methods: {
handleAction(key, data) {
console.log('按钮点击:', key, data)
}
}
}
</script>
自定义字段映射
<template>
<OrderManager
:orders="orders"
:fieldMap="customFieldMap"
/>
</template>
<script>
export default {
data() {
return {
customFieldMap: {
list: 'products',
itemId: 'id',
productName: 'name',
spec: 'specification',
quantity: 'count',
price: 'amount',
image: 'imgUrl',
shopId: 'storeId',
shopName: 'storeName',
status: 'orderStatus',
statusText: 'statusDesc',
createTime: 'orderTime'
}
}
}
}
</script>
自定义样式
<template>
<OrderManager
:orders="orders"
:styles="customStyles"
/>
</template>
<script>
export default {
data() {
return {
customStyles: {
primaryBtnBgColor: '#4a9eff',
activeColor: '#4a9eff',
activeBorderColor: '#4a9eff',
pendingColor: '#ff5722',
shippedColor: '#1989fa',
shopName: { fontSize: '30rpx', color: '#333' },
productName: { fontSize: '28rpx', color: '#333' }
}
}
}
}
</script>
隐藏标签栏
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:showTabs="false"
/>
</template>
效果:标签栏不显示,滚动区域高度自动扩展为全屏。
隐藏操作按钮栏
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:showActions="false"
/>
</template>
效果:订单卡片底部的操作按钮栏不显示,适用于只展示订单信息的场景。
启用图片懒加载
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:lazyLoad="true"
/>
</template>
效果:商品图片在进入可视区域时才加载,提升页面性能。
禁用指定标签
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
/>
</template>
<script>
export default {
data() {
return {
tabs: [
{ key: 0, label: '全部', count: 10 },
{ key: 1, label: '待付款', count: 3 },
{ key: 2, label: '暂不可用', disabled: true },
{ key: 3, label: '待评价', count: 2 }
]
}
}
}
</script>
效果:禁用的标签显示灰色,不可点击。
自定义卡片背景色和边框样式
<template>
<OrderManager
:tabs="tabs"
:orders="orders"
:styles="customStyles"
/>
</template>
<script>
export default {
data() {
return {
customStyles: {
// 背景色配置
cardBgColor: '#f8f9fa', // 卡片背景色
productRowBgColor: '#ffffff', // 商品行背景色
// 边框样式配置
borderColor: '#e8e8e8', // 边框颜色
borderStyle: 'solid', // 边框样式 (solid/dashed/dotted)
borderRadius: '20rpx', // 边框圆角
borderWidth: '2rpx' // 边框宽度
}
}
}
}
</script>
效果:订单卡片使用自定义的背景色和边框样式。
订单数据格式
多店铺模式数据格式
orders: [
{
shopId: 'S001',
shopName: '店铺A',
list: [
{
itemId: 'P001',
productName: '商品名称',
spec: '规格描述',
quantity: 2,
price: 99.9,
image: 'https://example.com/product.jpg',
status: 1,
statusText: '待付款'
}
],
totalAmount: 199.8,
createTime: '2024-01-15 10:30:00'
}
]
单店铺模式数据格式
orders: [
{
itemId: 'P001',
productName: '商品名称',
spec: '规格描述',
quantity: 2,
price: 99.9,
image: 'https://example.com/product.jpg',
status: 1,
statusText: '待付款',
createTime: '2024-01-15 10:30:00'
}
]
注意事项
- 数据格式:确保传入的订单数据格式与
fieldMap配置一致 - 状态码:订单状态码应与组件内部定义的状态映射一致(1-待付款、2-待收货、3-待评价、4-已完成、5-待发货、6-退款/售后)
- 按钮权限:自定义按钮会根据订单状态进行过滤,只有状态允许的按钮才会显示
- 图片资源:商品图片应使用可访问的 URL 地址
版本历史
| 版本 | 更新日期 | 更新内容 |
|---|---|---|
| 1.0.0 | 2024-01-15 | 初始版本 |
| 1.1.0 | 2024-06-04 | 添加标签禁用状态、图片懒加载、点击反馈、按钮尺寸自定义 |
许可证
MIT License

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 7
赞赏 0
下载 12153686
赞赏 1918
赞赏
京公网安备:11010802035340号