xt-element-ui 1.2.5 → 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -0
- package/LICENSE +21 -0
- package/README.md +240 -104
- package/docs/README.md +67 -168
- package/docs/components/base/xt-card-item.md +1 -1
- package/docs/components/base/xt-step-price.md +280 -0
- package/docs/components/base/xt-time.md +165 -0
- package/docs/components/extend/ex-chart.md +252 -144
- package/docs/components/extend/ex-date-picker.md +0 -0
- package/docs/components/extend/ex-icon.md +1 -2
- package/docs/components/extend/ex-page.md +0 -75
- package/lib/index.common.js +1172 -586
- package/lib/index.css +1 -1
- package/lib/index.umd.js +1172 -586
- package/lib/index.umd.min.js +5 -5
- package/package.json +80 -41
- package/src/components/ex-chart/ExBar.vue +35 -29
- package/src/components/ex-chart/ExLine.vue +23 -14
- package/src/components/ex-chart/ExMulti.vue +30 -52
- package/src/components/ex-chart/ExPie.vue +23 -16
- package/src/components/ex-chart/theme/dark.js +5 -4
- package/src/components/ex-chart/theme/white.js +1 -0
- package/src/components/ex-chart/utils.js +148 -7
- package/src/components/ex-date-picker/index.js +2 -0
- package/src/components/{xt-date-picker → ex-date-picker}/index.vue +1 -1
- package/src/components/index.scss +6 -0
- package/src/components/xt-card-item/index.vue +3 -1
- package/src/components/xt-step-price/index.js +2 -0
- package/src/components/xt-step-price/index.vue +270 -0
- package/src/components/xt-step-price/style/index.scss +115 -0
- package/src/components/xt-step-price-item/index.js +2 -0
- package/src/components/xt-step-price-item/index.vue +174 -0
- package/src/components/xt-time/index.js +2 -0
- package/src/components/xt-time/index.vue +313 -0
- package/src/components/xt-time/style/index.scss +23 -0
- package/src/index.js +12 -3
- package/src/components/ex-chart/theme/blue.js +0 -91
- package/src/components/ex-chart/theme/orange.js +0 -92
- package/src/components/ex-chart/theme/starry.js +0 -106
- package/src/components/xt-date-picker/index.js +0 -2
- /package/src/components/{xt-date-picker → ex-date-picker}/SearchDate.vue +0 -0
- /package/src/components/{xt-date-picker → ex-date-picker}/quarter.vue +0 -0
package/docs/README.md
CHANGED
|
@@ -1,201 +1,100 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
| XtButton | 按钮组件 |
|
|
26
|
-
| XtCard | 卡片组件 |
|
|
27
|
-
| XtCardItem | 卡片项组件 |
|
|
28
|
-
| XtFlexBox | 弹性布局组件 |
|
|
29
|
-
| XtGridBox | 网格布局组件 |
|
|
30
|
-
| XtGridItem | 网格子项组件 |
|
|
31
|
-
| XtText | 文本组件 |
|
|
32
|
-
| XtInput | 输入框组件 |
|
|
33
|
-
| XtDatePicker | 日期选择组件 |
|
|
34
|
-
| XtConfigProvider | 配置提供器 |
|
|
35
|
-
|
|
36
|
-
### Ex 组件(扩展组件)
|
|
37
|
-
|
|
38
|
-
基于 ElementUI 或 ECharts 二次封装的增强组件:
|
|
39
|
-
|
|
40
|
-
| 组件 | 说明 |
|
|
41
|
-
|------|------|
|
|
42
|
-
| ExButton | 基于 ElementUI Button 的扩展按钮 |
|
|
43
|
-
| ExCard | 基于 ElementUI Card 的扩展卡片 |
|
|
44
|
-
| ExTable | 基于 ElementUI Table 的扩展表格 |
|
|
45
|
-
| ExChart | 图表容器组件 |
|
|
46
|
-
| ExBar | 基于 ECharts 的柱状图 |
|
|
47
|
-
| ExLine | 基于 ECharts 的折线图 |
|
|
48
|
-
| ExPie | 基于 ECharts 的饼图 |
|
|
49
|
-
| ExMulti | 基于 ECharts 的混合图表 |
|
|
50
|
-
| ExTrend | 基于 ECharts 的趋势图 |
|
|
51
|
-
|
|
52
|
-
### 命名规范
|
|
53
|
-
|
|
54
|
-
| 前缀 | 含义 | 示例 |
|
|
55
|
-
|------|------|------|
|
|
56
|
-
| `Xt` | 自定义组件,全新开发 | XtButton, XtCard, XtFlexBox, XtGridBox |
|
|
57
|
-
| `Ex` | 基于 ElementUI/ECharts 二次封装 | ExTable, ExBar, ExLine, ExChart |
|
|
58
|
-
|
|
59
|
-
## 快速开始
|
|
1
|
+
---
|
|
2
|
+
home: true
|
|
3
|
+
heroImage: /favicon.ico
|
|
4
|
+
heroText: XT-Element-UI
|
|
5
|
+
tagline: 基于 Vue 2.7 + ElementUI 的企业级组件库
|
|
6
|
+
actionText: 🚀 快速上手
|
|
7
|
+
actionLink: /components/base/xt-button
|
|
8
|
+
features:
|
|
9
|
+
- title: 🎯 丰富的组件
|
|
10
|
+
details: 提供 15+ 组件,覆盖布局、表单、数据展示、图表等常见场景
|
|
11
|
+
- title: 📦 开箱即用
|
|
12
|
+
details: 基于 ElementUI 构建,与现有 ElementUI 项目无缝集成
|
|
13
|
+
- title: 🪶 按需引入
|
|
14
|
+
details: 完整的 npm 包架构,支持按需引入,减小打包体积
|
|
15
|
+
- title: 🎨 双架构设计
|
|
16
|
+
details: Xt 自定义组件 + Ex 扩展组件,职责清晰、便于维护
|
|
17
|
+
- title: 🌓 主题系统
|
|
18
|
+
details: 支持亮色/暗色主题切换,支持自定义主色调
|
|
19
|
+
- title: 📊 图表能力
|
|
20
|
+
details: 内置 ECharts 封装,提供柱状图、折线图、饼图、混合图
|
|
21
|
+
footer: MIT Licensed | Copyright © 2026 XT-Element-UI
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
::: tip 💡 快速开始
|
|
60
25
|
|
|
61
26
|
```bash
|
|
62
27
|
# 安装
|
|
63
|
-
npm install xt-element-ui
|
|
64
|
-
```
|
|
28
|
+
npm install xt-element-ui --save
|
|
65
29
|
|
|
66
|
-
|
|
67
|
-
// 全局引入
|
|
30
|
+
# 全局引入
|
|
68
31
|
import Vue from 'vue'
|
|
69
32
|
import XtElementUI from 'xt-element-ui'
|
|
70
33
|
import 'xt-element-ui/lib/index.css'
|
|
71
34
|
|
|
72
35
|
Vue.use(XtElementUI)
|
|
73
|
-
|
|
74
|
-
// 或按需引入
|
|
75
|
-
import { XtButton, XtFlexBox, XtCard } from 'xt-element-ui'
|
|
76
|
-
|
|
77
|
-
Vue.component('XtButton', XtButton)
|
|
78
|
-
Vue.component('XtFlexBox', XtFlexBox)
|
|
79
|
-
Vue.component('XtCard', XtCard)
|
|
80
36
|
```
|
|
81
37
|
|
|
82
|
-
|
|
38
|
+
:::
|
|
83
39
|
|
|
84
|
-
|
|
40
|
+
---
|
|
85
41
|
|
|
86
|
-
|
|
87
|
-
Vue.use(XtElementUI, {
|
|
88
|
-
theme: 'dark', // 主题:'white' 或 'dark'
|
|
89
|
-
size: 'medium', // 字体大小:'small', 'medium', 'large'
|
|
90
|
-
primaryColor: '#1890ff' // 主色调
|
|
91
|
-
})
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## 工具函数
|
|
95
|
-
|
|
96
|
-
提供全局工具函数用于动态配置:
|
|
97
|
-
|
|
98
|
-
```javascript
|
|
99
|
-
// 设置主题
|
|
100
|
-
this.$xt.setTheme('dark')
|
|
101
|
-
|
|
102
|
-
// 设置字体大小
|
|
103
|
-
this.$xt.setSize('large')
|
|
42
|
+
## 📦 组件概览
|
|
104
43
|
|
|
105
|
-
|
|
106
|
-
this.$xt.setPrimaryColor('#52c41a')
|
|
107
|
-
|
|
108
|
-
// 获取当前配置
|
|
109
|
-
console.log(this.$xt.getConfig())
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## 布局类组件
|
|
113
|
-
|
|
114
|
-
| 组件 | 说明 |
|
|
115
|
-
|------|------|
|
|
116
|
-
| XtFlexBox | 弹性盒布局,支持灵活的对齐和排列 |
|
|
117
|
-
| XtGridBox | CSS Grid 网格布局,支持跨列跨行 |
|
|
118
|
-
| XtGridItem | Grid 子项组件,支持 span、area 等属性 |
|
|
44
|
+
### 🎨 Xt 组件(自定义组件)
|
|
119
45
|
|
|
120
|
-
|
|
46
|
+
全新开发、不依赖 ElementUI 原有组件:
|
|
121
47
|
|
|
122
48
|
| 组件 | 说明 |
|
|
123
49
|
|------|------|
|
|
124
|
-
| XtButton |
|
|
125
|
-
|
|
|
126
|
-
|
|
|
50
|
+
| **XtButton** | 按钮组件 |
|
|
51
|
+
| **XtCard** | 卡片组件 |
|
|
52
|
+
| **XtCardItem** | 卡片项组件 |
|
|
53
|
+
| **XtFlexBox** | 弹性布局组件 |
|
|
54
|
+
| **XtGridBox** | 网格布局组件 |
|
|
55
|
+
| **XtText** | 文本组件 |
|
|
56
|
+
| **XtInput** | 输入框组件 |
|
|
57
|
+
| **XtConfigProvider** | 全局配置提供器 |
|
|
127
58
|
|
|
128
|
-
|
|
59
|
+
### ✨ Ex 组件(扩展组件)
|
|
129
60
|
|
|
130
|
-
|
|
131
|
-
|------|------|
|
|
132
|
-
| XtCard | 卡片容器组件 |
|
|
133
|
-
| XtCardItem | 卡片内项组件 |
|
|
134
|
-
| XtText | 文本组件,支持多种样式 |
|
|
135
|
-
| ExTable | 扩展表格,支持导出等功能 |
|
|
136
|
-
|
|
137
|
-
## 图表组件
|
|
61
|
+
基于 ElementUI / ECharts 二次封装的增强组件:
|
|
138
62
|
|
|
139
63
|
| 组件 | 说明 |
|
|
140
64
|
|------|------|
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
|
|
|
144
|
-
| ExPie |
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
### 亮色/暗色主题
|
|
151
|
-
|
|
152
|
-
```vue
|
|
153
|
-
<template>
|
|
154
|
-
<div>
|
|
155
|
-
<XtButton @click="$xt.setTheme('white')">亮色主题</XtButton>
|
|
156
|
-
<XtButton @click="$xt.setTheme('dark')">暗色主题</XtButton>
|
|
157
|
-
</div>
|
|
158
|
-
</template>
|
|
159
|
-
```
|
|
65
|
+
| **ExButton** | 基于 ElementUI Button 的扩展按钮 |
|
|
66
|
+
| **ExCard** | 基于 ElementUI Card 的扩展卡片 |
|
|
67
|
+
| **ExTable** | 基于 ElementUI Table 的扩展表格(支持虚拟滚动) |
|
|
68
|
+
| **ExBar / ExLine / ExPie / ExMulti** | 基于 ECharts 的图表组件 |
|
|
69
|
+
| **ExSelectTree** | 下拉选择树组件 |
|
|
70
|
+
| **ExUpload** | 上传组件(支持图片预览) |
|
|
71
|
+
| **ExPage** | 页面组件 |
|
|
72
|
+
| **ExDatePicker** | 日期选择组件 |
|
|
73
|
+
| **ExIcon** | 图标组件(支持 SVG / 字体图标) |
|
|
160
74
|
|
|
161
|
-
|
|
75
|
+
---
|
|
162
76
|
|
|
163
|
-
|
|
164
|
-
<template>
|
|
165
|
-
<div>
|
|
166
|
-
<XtButton @click="$xt.setSize('small')">小号字体</XtButton>
|
|
167
|
-
<XtButton @click="$xt.setSize('medium')">中号字体</XtButton>
|
|
168
|
-
<XtButton @click="$xt.setSize('large')">大号字体</XtButton>
|
|
169
|
-
</div>
|
|
170
|
-
</template>
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
## 浏览器支持
|
|
77
|
+
## 🌐 GitHub Pages 自动部署
|
|
174
78
|
|
|
175
|
-
|
|
176
|
-
- Firefox
|
|
177
|
-
- Safari
|
|
178
|
-
- Edge
|
|
79
|
+
本项目通过 **GitHub Actions** 自动构建并部署文档到 **GitHub Pages**:
|
|
179
80
|
|
|
180
|
-
|
|
81
|
+
- 📖 **在线文档**:https://JobWebNie.github.io/xt-element-ui/
|
|
82
|
+
- 🐛 **问题反馈**:https://github.com/JobWebNie/xt-element-ui/issues
|
|
83
|
+
- 📦 **npm 主页**:https://www.npmjs.com/package/xt-element-ui
|
|
181
84
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
85
|
+
推送代码到 `main` / `master` 分支后,GitHub Actions 将自动执行:
|
|
86
|
+
1. 安装依赖
|
|
87
|
+
2. 构建 VuePress 文档
|
|
88
|
+
3. 部署到 GitHub Pages
|
|
185
89
|
|
|
186
|
-
|
|
187
|
-
npm install
|
|
90
|
+
---
|
|
188
91
|
|
|
189
|
-
|
|
190
|
-
npm run dev
|
|
92
|
+
## 📚 更多资源
|
|
191
93
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
npm run build
|
|
197
|
-
```
|
|
94
|
+
- **[查看完整文档](https://JobWebNie.github.io/xt-element-ui/)**
|
|
95
|
+
- **[更新日志](https://github.com/JobWebNie/xt-element-ui/blob/main/CHANGELOG.md)**
|
|
96
|
+
- **[贡献指南](https://github.com/JobWebNie/xt-element-ui/blob/main/CONTRIBUTING.md)**
|
|
97
|
+
- **[GitHub 仓库](https://github.com/JobWebNie/xt-element-ui)**
|
|
198
98
|
|
|
199
|
-
## 许可证
|
|
200
99
|
|
|
201
|
-
|
|
100
|
+
# 在 GitHub 新建仓库后
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
## XtStepPrice 阶梯价格组件
|
|
2
|
+
|
|
3
|
+
用于配置「根据数量区间 → 单价」阶梯型价格配置。
|
|
4
|
+
|
|
5
|
+
- 最小数量从 `0` 开始,最后一档为 `[min, +∞)`
|
|
6
|
+
- 支持动态增减阶梯;删除后前后区间自动对接到一起保证连续性
|
|
7
|
+
- 提供 `XtStepPriceItem` 子组件,方便自定义场景下单独使用
|
|
8
|
+
|
|
9
|
+
## 基本用法
|
|
10
|
+
|
|
11
|
+
::: demo 基本用法
|
|
12
|
+
```vue
|
|
13
|
+
<template>
|
|
14
|
+
<XtStepPrice v-model="items" title="阶梯价格" />
|
|
15
|
+
<XtText size="small" style="margin-top: 12px;">当前值:{{ JSON.stringify(items) }}</XtText>
|
|
16
|
+
</template>
|
|
17
|
+
|
|
18
|
+
<script>
|
|
19
|
+
export default {
|
|
20
|
+
data() {
|
|
21
|
+
return {
|
|
22
|
+
items: [
|
|
23
|
+
{ min: 0, max: 100, price: 10 },
|
|
24
|
+
{ min: 100, max: 500, price: 8 },
|
|
25
|
+
{ min: 500, max: null, price: 5 }
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
</script>
|
|
31
|
+
```
|
|
32
|
+
:::
|
|
33
|
+
|
|
34
|
+
## 自定义单位和小数位
|
|
35
|
+
|
|
36
|
+
::: demo 自定义单位和小数位
|
|
37
|
+
```vue
|
|
38
|
+
<template>
|
|
39
|
+
<XtStepPrice
|
|
40
|
+
v-model="items"
|
|
41
|
+
title="批发阶梯价(美元,保留 4 位小数)"
|
|
42
|
+
unit="美元"
|
|
43
|
+
:precision="4"
|
|
44
|
+
/>
|
|
45
|
+
</template>
|
|
46
|
+
|
|
47
|
+
<script>
|
|
48
|
+
export default {
|
|
49
|
+
data() {
|
|
50
|
+
return {
|
|
51
|
+
items: [
|
|
52
|
+
{ min: 0, max: 100, price: 1.25 },
|
|
53
|
+
{ min: 100, max: null, price: 0.85 }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
</script>
|
|
59
|
+
```
|
|
60
|
+
:::
|
|
61
|
+
|
|
62
|
+
## 只读态
|
|
63
|
+
|
|
64
|
+
::: demo 只读态
|
|
65
|
+
```vue
|
|
66
|
+
<template>
|
|
67
|
+
<XtStepPrice
|
|
68
|
+
v-model="items"
|
|
69
|
+
title="阶梯价格(只读)"
|
|
70
|
+
disabled
|
|
71
|
+
/>
|
|
72
|
+
</template>
|
|
73
|
+
|
|
74
|
+
<script>
|
|
75
|
+
export default {
|
|
76
|
+
data() {
|
|
77
|
+
return {
|
|
78
|
+
items: [
|
|
79
|
+
{ min: 0, max: 100, price: 10 },
|
|
80
|
+
{ min: 100, max: 500, price: 8 },
|
|
81
|
+
{ min: 500, max: null, price: 5 }
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
</script>
|
|
87
|
+
```
|
|
88
|
+
:::
|
|
89
|
+
|
|
90
|
+
## 自定义括号与字段名
|
|
91
|
+
|
|
92
|
+
::: demo 自定义括号与字段名
|
|
93
|
+
```vue
|
|
94
|
+
<template>
|
|
95
|
+
<XtStepPrice
|
|
96
|
+
v-model="items"
|
|
97
|
+
title="自定义括号"
|
|
98
|
+
left-bracket="("
|
|
99
|
+
right-bracket="]"
|
|
100
|
+
/>
|
|
101
|
+
<XtText size="small" style="margin-top: 12px;">输出:{{ JSON.stringify(items) }}</XtText>
|
|
102
|
+
|
|
103
|
+
<XtStepPrice
|
|
104
|
+
v-model="backendItems"
|
|
105
|
+
title="适配后端字段结构"
|
|
106
|
+
:field-keys="{ min: 'low', max: 'high', price: 'unitPrice' }"
|
|
107
|
+
style="margin-top: 24px;"
|
|
108
|
+
/>
|
|
109
|
+
<XtText size="small" style="margin-top: 12px;">后端字段:{{ JSON.stringify(backendItems) }}</XtText>
|
|
110
|
+
</template>
|
|
111
|
+
|
|
112
|
+
<script>
|
|
113
|
+
export default {
|
|
114
|
+
data() {
|
|
115
|
+
return {
|
|
116
|
+
items: [
|
|
117
|
+
{ min: 0, max: 100, price: 10 },
|
|
118
|
+
{ min: 100, max: null, price: 5 }
|
|
119
|
+
],
|
|
120
|
+
backendItems: [
|
|
121
|
+
{ low: 0, high: 200, unitPrice: 15 },
|
|
122
|
+
{ low: 200, high: null, unitPrice: 8 }
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
</script>
|
|
128
|
+
```
|
|
129
|
+
:::
|
|
130
|
+
|
|
131
|
+
## 限制阶梯数量(limit)
|
|
132
|
+
|
|
133
|
+
::: demo 限制阶梯数量
|
|
134
|
+
```vue
|
|
135
|
+
<template>
|
|
136
|
+
<XtStepPrice v-model="items" title="最多 3 档" :limit="3" />
|
|
137
|
+
<XtText size="small" style="margin-top: 12px;">输出:{{ JSON.stringify(items) }}</XtText>
|
|
138
|
+
</template>
|
|
139
|
+
|
|
140
|
+
<script>
|
|
141
|
+
export default {
|
|
142
|
+
data() {
|
|
143
|
+
return {
|
|
144
|
+
items: [
|
|
145
|
+
{ min: 0, max: 100, price: 10 }
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
</script>
|
|
151
|
+
```
|
|
152
|
+
:::
|
|
153
|
+
|
|
154
|
+
## 使用 XtStepPriceItem 自定义布局
|
|
155
|
+
|
|
156
|
+
::: demo 使用 XtStepPriceItem 自定义布局
|
|
157
|
+
```vue
|
|
158
|
+
<template>
|
|
159
|
+
<div style="display: flex; flex-direction: column; gap: 8px;">
|
|
160
|
+
<XtStepPriceItem
|
|
161
|
+
v-for="(item, idx) in items"
|
|
162
|
+
:key="idx"
|
|
163
|
+
:value="item"
|
|
164
|
+
:index="idx"
|
|
165
|
+
:is-first="idx === 0"
|
|
166
|
+
:is-last="idx === items.length - 1"
|
|
167
|
+
:items-length="items.length"
|
|
168
|
+
:min-locked="idx !== 0"
|
|
169
|
+
@input="(val) => onInput(val, idx)"
|
|
170
|
+
@delete="onDelete"
|
|
171
|
+
/>
|
|
172
|
+
<el-button size="small" type="primary" plain icon="el-icon-plus" @click="onAdd">新增</el-button>
|
|
173
|
+
</div>
|
|
174
|
+
</template>
|
|
175
|
+
|
|
176
|
+
<script>
|
|
177
|
+
export default {
|
|
178
|
+
data() {
|
|
179
|
+
return {
|
|
180
|
+
items: [
|
|
181
|
+
{ min: 0, max: 100, price: 10 },
|
|
182
|
+
{ min: 100, max: null, price: 6 }
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
methods: {
|
|
187
|
+
onInput(val, idx) {
|
|
188
|
+
this.$set(this.items, idx, val)
|
|
189
|
+
},
|
|
190
|
+
onAdd() {
|
|
191
|
+
const last = this.items[this.items.length - 1]
|
|
192
|
+
if (!last) {
|
|
193
|
+
this.items.push({ min: 0, max: null, price: 0 })
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
const cur = { min: last.min, max: last.min + 1, price: last.price }
|
|
197
|
+
last.min = cur.max
|
|
198
|
+
this.items.splice(this.items.length - 1, 0, cur)
|
|
199
|
+
},
|
|
200
|
+
onDelete(idx) {
|
|
201
|
+
if (this.items.length <= 1) return
|
|
202
|
+
this.items.splice(idx, 1)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
</script>
|
|
207
|
+
```
|
|
208
|
+
:::
|
|
209
|
+
|
|
210
|
+
## 属性说明
|
|
211
|
+
|
|
212
|
+
### XtStepPrice
|
|
213
|
+
|
|
214
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
215
|
+
|------|------|--------|------|
|
|
216
|
+
| `value` | `Array<{min, max, price}>` | `[{min:0, max:null, price:0}]` | 阶梯数组,`v-model` 绑定,支持 `.sync` 风格亦可 |
|
|
217
|
+
| `title` | String | `''` | 标题 |
|
|
218
|
+
| `unit` | String | `'元'` | 价格单位 |
|
|
219
|
+
| `precision` | Number | `2` | 价格小数位(失焦后自动格式化) |
|
|
220
|
+
| `left-bracket` | String | `'['` | 左括号显示字符,传空字符串则不显示 |
|
|
221
|
+
| `right-bracket` | String | `null` | 右括号显示字符;传 `null` 走内置规则(仅 1 条时为 `]`,多条为 `)`),传具体值则强制显示 |
|
|
222
|
+
| `field-keys` | `{min, max, price}` | `{min:'min', max:'max', price:'price'}` | 自定义字段名映射 |
|
|
223
|
+
| `limit` | Number | `0` | 阶梯数量上限;`<= 0` 表示不限制;达到上限时隐藏新增按钮并提示 |
|
|
224
|
+
| `disabled` | Boolean | `false` | 是否禁用/只读 |
|
|
225
|
+
| `tip` | String | 中文提示文案 | 底部提示文案 |
|
|
226
|
+
| `default-first` | Boolean | `true` | 传入空数组时是否自动生成首条 `[0, +∞)` |
|
|
227
|
+
|
|
228
|
+
### XtStepPriceItem
|
|
229
|
+
|
|
230
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
231
|
+
|------|------|--------|------|
|
|
232
|
+
| `value` | `{min, max, price}` | `{min: 0, max: null, price: 0}` | 单条阶梯的值 |
|
|
233
|
+
| `index` | Number | `0` | 索引,用于事件回调 |
|
|
234
|
+
| `is-first` | Boolean | `false` | 是否首条(首条 `min` 固定为 `0` 且锁定不可改) |
|
|
235
|
+
| `is-last` | Boolean | `false` | 是否末条(末条 `max` 显示为 `+∞`) |
|
|
236
|
+
| `items-length` | Number | `1` | 当前阶梯总数,用于决定是否可删除及右括号默认策略 |
|
|
237
|
+
| `min-locked` | Boolean | `false` | 是否锁定 `min` 输入框 |
|
|
238
|
+
| `unit` | String | `'元'` | 价格单位 |
|
|
239
|
+
| `precision` | Number | `2` | 价格小数位 |
|
|
240
|
+
| `left-bracket` | String | `'['` | 左括号显示字符 |
|
|
241
|
+
| `right-bracket` | String | `null` | 右括号;为 `null` 走默认逻辑(仅 1 条→ `]`,多条→ `)`) |
|
|
242
|
+
| `field-keys` | `{min, max, price}` | `{min:'min', max:'max', price:'price'}` | 自定义字段名映射 |
|
|
243
|
+
| `removable` | Boolean | `true` | 是否可删除(`removable=true` 且 `items-length>1` 时才显示删除按钮) |
|
|
244
|
+
| `disabled` | Boolean | `false` | 是否禁用 |
|
|
245
|
+
|
|
246
|
+
## 事件
|
|
247
|
+
|
|
248
|
+
### XtStepPrice
|
|
249
|
+
|
|
250
|
+
| 事件 | 说明 | 参数 |
|
|
251
|
+
|------|------|------|
|
|
252
|
+
| `input` | 值变化(v-model 自动更新) | 最新的 items 数组 |
|
|
253
|
+
| `change` | 任何引起值变化的动作(新增/删除/修改) | 最新的 items 数组 |
|
|
254
|
+
|
|
255
|
+
### XtStepPriceItem
|
|
256
|
+
|
|
257
|
+
| 事件 | 说明 | 参数 |
|
|
258
|
+
|------|------|------|
|
|
259
|
+
| `input` | 该条值变化 | `{min, max, price}` |
|
|
260
|
+
| `change` | 该条值变化 | `{min, max, price}, index` |
|
|
261
|
+
| `min-change` | min 失焦修改 | `min, index` |
|
|
262
|
+
| `max-change` | max 失焦修改 | `max, index` |
|
|
263
|
+
| `delete` | 点击删除 | `index` |
|
|
264
|
+
|
|
265
|
+
## 插槽
|
|
266
|
+
|
|
267
|
+
### XtStepPrice
|
|
268
|
+
|
|
269
|
+
| 插槽 | 说明 |
|
|
270
|
+
|------|------|
|
|
271
|
+
| `header` | 头部右侧自定义内容 |
|
|
272
|
+
| `tip` | 底部提示自定义内容 |
|
|
273
|
+
|
|
274
|
+
## 注意事项
|
|
275
|
+
|
|
276
|
+
1. **首条 `min` 固定为 `0` 且锁定不可编辑,保证最小数量从 0 开始。
|
|
277
|
+
2. **末条 `max` 固定为 `+∞`,保证任何数量都能匹配到一个区间。
|
|
278
|
+
3. **连续性保证**:任意两条相邻阶梯,后一条的 `min` 始终等于前一条的 `max`;删除中间阶梯后,前后自动对接到一起。
|
|
279
|
+
4. 容器内的 `XtStepPriceItem` 的 `min` 输入框对非首条默认锁定,避免用户误操作破坏连续性;如需自由编辑,可单独使用 `XtStepPriceItem` 自行管理数据。
|
|
280
|
+
5. `price` 输入值小于 `0` 时自动修正为 `0`。
|