@opentinyvue/vue-docs 3.28.0 → 3.28.2

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.
@@ -168,5 +168,6 @@ const options = ref([
168
168
  }
169
169
  ])
170
170
 
171
- const value = 'anzhuangcli'
171
+ // 使用 ref 创建响应式引用,这样才能用于 v-model 双向绑定
172
+ const value = ref('anzhuangcli')
172
173
  </script>
@@ -402,6 +402,7 @@ export const batch3Icons = [
402
402
  'IconTermination',
403
403
  'IconTimezone',
404
404
  'IconTrain',
405
+ 'IconTransfer',
405
406
  'IconTransferInventoryList',
406
407
  'IconTransferringInventoryListsAcrossOrganizations',
407
408
  'IconTransportation',
@@ -409,106 +410,3 @@ export const batch3Icons = [
409
410
  'IconWaybill',
410
411
  'IconWorkOvertime'
411
412
  ]
412
-
413
- export const batch4Icons = [
414
- 'IconAIAbout',
415
- 'IconAIApplication',
416
- 'IconAIBrowsingHistory',
417
- 'IconAICalendar',
418
- 'IconAIComputingPowerAIPolicy',
419
- 'IconAIConferenceManagement',
420
- 'IconAIDocument',
421
- 'IconAIDocumentQA',
422
- 'IconAIExternalKnowledgeAnswer',
423
- 'IconAIFindRecords',
424
- 'IconAIFollowUp',
425
- 'IconAIGCPainting',
426
- 'IconAIImageBasedTextRecognition',
427
- 'IconAIInformation',
428
- 'IconAIInternalKnowledgeAnswers',
429
- 'IconAIITServiceQA',
430
- 'IconAILabelExtraction',
431
- 'IconAIMemorySpace',
432
- 'IconAIOfficeDataSearch',
433
- 'IconAIOrganization',
434
- 'IconAIPosting',
435
- 'IconAIProcessQA',
436
- 'IconAIQuestion',
437
- 'IconAIReading',
438
- 'IconAISearch',
439
- 'IconAISearchPeople',
440
- 'IconAISearchQA',
441
- 'IconAISmartLookup',
442
- 'IconAISmartNotes',
443
- 'IconAISmartTranslation',
444
- 'IconAITakingPhotos',
445
- 'IconAITechnicalInsightsQA',
446
- 'IconAITerminologyQA',
447
- 'IconAITranslation',
448
- 'IconAIUCDSearch',
449
- 'IconAIWebQA',
450
- 'IconAIWrite',
451
- 'IconAIWriting',
452
- 'IconAnalysisTypeContainer',
453
- 'IconAnchor',
454
- 'IconApprovalFlow',
455
- 'IconAvatar',
456
- 'IconBadge',
457
- 'IconButtonBar',
458
- 'IconCalendarView',
459
- 'IconCardGroup',
460
- 'IconCardTemplate',
461
- 'IconCarousel',
462
- 'IconCascader',
463
- 'IconChart',
464
- 'IconCheckbox',
465
- 'IconChooser',
466
- 'IconCreatePage',
467
- 'IconDetailsTemplatePage',
468
- 'IconDialogSelect',
469
- 'IconFilterView',
470
- 'IconFloating',
471
- 'IconFlowchart',
472
- 'IconFoldingPanelContainers',
473
- 'IconForm',
474
- 'IconGeneralPage',
475
- 'IconGrid',
476
- 'IconImage',
477
- 'IconInput',
478
- 'IconListSheet',
479
- 'IconMetAlert',
480
- 'IconMultiColumnContainer',
481
- 'IconMultipleContainerGroups',
482
- 'IconNavigationContainer',
483
- 'IconNumber',
484
- 'IconNumeric',
485
- 'IconObjectInfo',
486
- 'IconPageLoader',
487
- 'IconPager',
488
- 'IconProcessOverview',
489
- 'IconProgress',
490
- 'IconRadio',
491
- 'IconRecord',
492
- 'IconRuleBuilder',
493
- 'IconSelection',
494
- 'IconSelectView',
495
- 'IconShortcut',
496
- 'IconSlider',
497
- 'IconSliderButton',
498
- 'IconSplitPanelContainer',
499
- 'IconSpreadGrid',
500
- 'IconStandardList',
501
- 'IconSteps',
502
- 'IconSwitch',
503
- 'IconSwitchCard',
504
- 'IconTabContainer',
505
- 'IconTabs',
506
- 'IconTag',
507
- 'IconTagGroup',
508
- 'IconTimeLine',
509
- 'IconTimePicker',
510
- 'IconTitleContainer',
511
- 'IconTransfer',
512
- 'IconTree',
513
- 'IconTreeMenuContainer'
514
- ]
@@ -72,35 +72,13 @@
72
72
  <span class="svgs-text" :title="name">{{ name }}</span>
73
73
  </div>
74
74
  </div>
75
- <hr />
76
- <div class="svgs-wrapper">
77
- <div
78
- v-for="name in batch4Icons"
79
- :key="name"
80
- :class="{
81
- 'svg-visible': searchName === '' || name.toLowerCase().includes(searchName.toLowerCase()),
82
- 'svgs-item': true
83
- }"
84
- @click="click(name)"
85
- >
86
- <component
87
- :is="Svgs[name] && Svgs[name]()"
88
- class="svgs-icon"
89
- :first-color="firstColor"
90
- :second-color="secondColor"
91
- :shape="shape"
92
- :underlay="isUnderlay ? underlay : null"
93
- ></component>
94
- <span class="svgs-text" :title="name">{{ name }}</span>
95
- </div>
96
- </div>
97
75
  </div>
98
76
  </template>
99
77
 
100
78
  <script setup lang="js">
101
79
  import Svgs from '@opentiny/vue-icon'
102
80
  import { TinyForm, TinyFormItem, TinyModal, TinyInput, TinyRadioGroup, TinyRadio, TinySwitch } from '@opentiny/vue'
103
- import { advanceIcons, batch3Icons, batch4Icons } from './advance-icons.js'
81
+ import { advanceIcons, batch3Icons } from './advance-icons.js'
104
82
  import { getCurrentInstance, ref, watch } from 'vue'
105
83
 
106
84
  const searchName = ref('')
@@ -72,28 +72,6 @@
72
72
  <span class="svgs-text" :title="name">{{ name }}</span>
73
73
  </div>
74
74
  </div>
75
- <hr />
76
- <div class="svgs-wrapper">
77
- <div
78
- v-for="name in batch4Icons"
79
- :key="name"
80
- :class="{
81
- 'svg-visible': searchName === '' || name.toLowerCase().includes(searchName.toLowerCase()),
82
- 'svgs-item': true
83
- }"
84
- @click="click(name)"
85
- >
86
- <component
87
- :is="Svgs[name] && Svgs[name]()"
88
- class="svgs-icon"
89
- :first-color="firstColor"
90
- :second-color="secondColor"
91
- :shape="shape"
92
- :underlay="isUnderlay ? underlay : null"
93
- ></component>
94
- <span class="svgs-text" :title="name">{{ name }}</span>
95
- </div>
96
- </div>
97
75
  </div>
98
76
  </template>
99
77
 
@@ -109,7 +87,7 @@ import {
109
87
  TinyColorPicker,
110
88
  TinySwitch
111
89
  } from '@opentiny/vue'
112
- import { advanceIcons, batch3Icons, batch4Icons } from './advance-icons.js'
90
+ import { advanceIcons, batch3Icons } from './advance-icons.js'
113
91
 
114
92
  export default {
115
93
  components: {
@@ -126,7 +104,6 @@ export default {
126
104
  Svgs,
127
105
  advanceIcons,
128
106
  batch3Icons,
129
- batch4Icons,
130
107
  searchName: '',
131
108
  shape: 'line',
132
109
  firstColor: '#0067D1',
@@ -18,7 +18,7 @@ import { TinyTabs, TinyTabItem, TinySwitch } from '@opentiny/vue'
18
18
 
19
19
  const activeName4 = ref('navigation1')
20
20
  const tooltipConfig = ref({ effect: 'light', placement: 'left', visible: 'auto' })
21
- const value = true
21
+ const value = ref(true)
22
22
  const tabs3 = ref([
23
23
  {
24
24
  name: 'navigation1',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@opentinyvue/vue-docs",
3
3
  "type": "module",
4
- "version": "3.28.0",
4
+ "version": "3.28.2",
5
5
  "license": "MIT",
6
6
  "devDependencies": {
7
7
  "@playwright/test": "~1.49.0",
@@ -64,25 +64,25 @@
64
64
  "vue-i18n": "~9.14.3",
65
65
  "vue-router": "4.1.5",
66
66
  "zod": "^3.24.4",
67
- "@opentiny/utils": "npm:@opentinyvue/utils@~3.28.0",
68
67
  "@opentiny-internal/unplugin-virtual-template": "~0.1.1-beta.0",
69
- "@opentiny/vue": "~3.28.0",
68
+ "@opentiny/utils": "~3.28.0",
70
69
  "@opentiny/vue-common": "~3.28.0",
71
- "@opentiny/vue-design-aurora": "~3.28.0",
72
70
  "@opentiny/vue-design-saas": "~3.28.0",
71
+ "@opentiny/vue-design-aurora": "~3.28.0",
72
+ "@opentiny/vue-design-smb": "~3.28.0",
73
+ "@opentiny/vue": "~3.28.0",
73
74
  "@opentiny/vue-directive": "~3.28.0",
74
75
  "@opentiny/vue-flowchart": "~3.28.0",
75
- "@opentiny/vue-design-smb": "~3.28.0",
76
- "@opentiny/vue-hooks": "npm:@opentinyvue/vue-hooks@~3.28.0",
77
- "@opentiny/vue-huicharts": "~3.28.0",
78
- "@opentiny/vue-icon": "~3.28.0",
76
+ "@opentiny/vue-hooks": "~3.28.0",
79
77
  "@opentiny/vue-icon-multicolor": "~3.28.0",
80
78
  "@opentiny/vue-icon-saas": "~3.28.0",
79
+ "@opentiny/vue-icon": "~3.28.0",
81
80
  "@opentiny/vue-modal": "~3.28.0",
82
81
  "@opentiny/vue-locale": "~3.28.0",
83
82
  "@opentiny/vue-renderless": "~3.28.0",
84
- "@opentiny/vue-theme": "~3.28.0",
85
- "@opentiny/vue-theme-saas": "~3.28.0"
83
+ "@opentiny/vue-huicharts": "~3.28.0",
84
+ "@opentiny/vue-theme-saas": "~3.28.0",
85
+ "@opentiny/vue-theme": "~3.28.0"
86
86
  },
87
87
  "scripts": {
88
88
  "start": "vite",
@@ -1,943 +0,0 @@
1
- # 🎉 Tiny Vue 3.28.0 震撼发布:选择器家族大重构!
2
-
3
- > **发布日期:2025 年 12 月 29 日**
4
- > 这是一个让选择器组件"脱胎换骨"的版本!
5
-
6
- ---
7
-
8
- ## 📢 版本速览
9
-
10
- ![版本号徽章](https://img.shields.io/badge/version-3.28.0-blue)
11
- ![Vue2支持](https://img.shields.io/badge/Vue2-✅-green)
12
- ![Vue3支持](https://img.shields.io/badge/Vue3-✅-green)
13
-
14
- **v3.28.0** 版本带来了:
15
-
16
- - 🎯 **选择器组件家族全面重构** - 统一架构,性能提升
17
- - 🎨 **主题动画全局配置** - 一键定制,随心所欲
18
- - 🐛 **65+ Bug 修复** - 稳定性大幅提升
19
-
20
- ---
21
-
22
- ## 🚀 核心亮点:选择器组件"家族重组"
23
-
24
- ### 从"各自为政"到"统一架构"
25
-
26
- 还记得之前那些"长得像但代码不统一"的选择器组件吗?`select`、`tree-select`、`grid-select`、`base-select` 各自为政,维护起来让人头疼。
27
-
28
- ![选择器组件对比图]
29
-
30
- ```
31
- 旧版本:select | tree-select | grid-select | base-select
32
- ↓ ↓ ↓ ↓
33
- 各自维护,代码重复,体验不一致
34
-
35
- 新版本: select-wrapper
36
- ↓ ↓ ↓ ↓
37
- 统一架构,代码复用,体验一致
38
- ```
39
-
40
- **这次重构,我们做了三件大事:**
41
-
42
- 1. **统一架构设计** - 所有选择器组件都基于 `select-wrapper` 构建
43
- 2. **代码同步优化** - `base-select` 与 `select` 组件代码完全同步
44
- 3. **性能大幅提升** - 减少重复代码,提升渲染效率
45
-
46
- ### 重构背后的技术细节
47
-
48
- #### 为什么需要重构?
49
-
50
- 在重构之前,每个选择器组件都有自己独立的实现逻辑:
51
-
52
- - **代码重复率高** - 相同的功能在多个组件中重复实现,维护成本高
53
- - **体验不一致** - 不同组件的交互方式、样式表现存在差异
54
- - **扩展困难** - 新增功能需要在多个组件中同步修改
55
- - **性能瓶颈** - 重复的代码导致包体积增大,运行时性能受影响
56
-
57
- #### 新架构的优势
58
-
59
- 通过引入 `select-wrapper` 作为核心基础组件,我们实现了:
60
-
61
- **1. 统一的 API 设计**
62
- 所有选择器组件现在共享相同的核心 API,使用方式更加一致:
63
-
64
- ```vue
65
- <!-- 基础选择器 -->
66
- <tiny-select v-model="value" :options="options" />
67
-
68
- <!-- 树形选择器 -->
69
- <tiny-tree-select v-model="value" :data="treeData" />
70
-
71
- <!-- 表格选择器 -->
72
- <tiny-grid-select v-model="value" :data="gridData" />
73
- ```
74
-
75
- **2. 代码复用率提升 60%+**
76
- 通过抽取公共逻辑到 `select-wrapper`,代码重复率从原来的 70% 降低到 10% 以下。
77
-
78
- **3. 维护成本降低**
79
- 现在只需要在一个地方(`select-wrapper`)修复 bug 或添加功能,所有选择器组件都能自动受益。
80
-
81
- **4. 性能优化**
82
-
83
- - 减少了组件初始化时间
84
- - 降低了内存占用
85
- - 提升了渲染性能
86
-
87
- ### 实际使用场景
88
-
89
- #### 场景一:基础下拉选择
90
-
91
- ```vue
92
- <template>
93
- <tiny-select v-model="selectedValue" :options="options" placeholder="请选择" clearable filterable />
94
- </template>
95
-
96
- <script>
97
- export default {
98
- data() {
99
- return {
100
- selectedValue: '',
101
- options: [
102
- { label: '选项1', value: '1' },
103
- { label: '选项2', value: '2' },
104
- { label: '选项3', value: '3' }
105
- ]
106
- }
107
- }
108
- }
109
- </script>
110
- ```
111
-
112
- #### 场景二:树形数据选择
113
-
114
- ```vue
115
- <template>
116
- <tiny-tree-select v-model="selectedIds" :data="treeData" multiple check-strictly :default-expand-all="true" />
117
- </template>
118
-
119
- <script>
120
- export default {
121
- data() {
122
- return {
123
- selectedIds: [],
124
- treeData: [
125
- {
126
- id: '1',
127
- label: '一级节点',
128
- children: [
129
- { id: '1-1', label: '二级节点1' },
130
- { id: '1-2', label: '二级节点2' }
131
- ]
132
- }
133
- ]
134
- }
135
- }
136
- }
137
- </script>
138
- ```
139
-
140
- #### 场景三:表格数据选择
141
-
142
- ```vue
143
- <template>
144
- <tiny-grid-select v-model="selectedRows" :data="tableData" :columns="columns" multiple :pager="pager" />
145
- </template>
146
- ```
147
-
148
- ### 新增功能:懒加载支持
149
-
150
- `tree-select` 现在支持懒加载了!想象一下,一个包含 10,000 个节点的树形选择器,以前需要一次性加载所有数据,现在可以按需加载,性能提升不是一点点!
151
-
152
- #### 懒加载的使用场景
153
-
154
- 懒加载特别适合以下场景:
155
-
156
- 1. **大数据量树形结构** - 当树节点数量超过 1000 个时,懒加载可以显著提升性能
157
- 2. **动态数据加载** - 数据需要从服务器按需获取
158
- 3. **减少初始加载时间** - 只加载用户需要查看的节点
159
-
160
- #### 完整示例
161
-
162
- ```vue
163
- <template>
164
- <tiny-tree-select v-model="selectedValue" lazy :load="loadNode" :props="props" />
165
- </template>
166
-
167
- <script>
168
- export default {
169
- data() {
170
- return {
171
- selectedValue: '',
172
- props: {
173
- label: 'name',
174
- children: 'children',
175
- isLeaf: 'leaf'
176
- }
177
- }
178
- },
179
- methods: {
180
- loadNode(node, resolve) {
181
- // 如果是根节点
182
- if (node.level === 0) {
183
- // 加载第一层数据
184
- this.fetchRootNodes().then((data) => {
185
- resolve(data)
186
- })
187
- } else {
188
- // 加载子节点数据
189
- this.fetchChildNodes(node.data.id).then((data) => {
190
- resolve(data)
191
- })
192
- }
193
- },
194
- async fetchRootNodes() {
195
- // 模拟 API 调用
196
- const response = await fetch('/api/tree/root')
197
- return response.json()
198
- },
199
- async fetchChildNodes(parentId) {
200
- const response = await fetch(`/api/tree/children/${parentId}`)
201
- return response.json()
202
- }
203
- }
204
- }
205
- </script>
206
- ```
207
-
208
- #### 性能对比
209
-
210
- ![懒加载效果对比图]
211
-
212
- | 节点数量 | 旧版本加载时间 | 新版本初始加载时间 | 性能提升 |
213
- | -------- | -------------- | ------------------ | -------- |
214
- | 1,000 | 800ms | 50ms | 16x |
215
- | 5,000 | 4,200ms | 50ms | 84x |
216
- | 10,000 | 8,500ms | 50ms | 170x |
217
-
218
- - **旧版本**:一次性加载所有节点,页面卡顿 😫
219
- - **新版本**:按需加载,丝滑流畅 ✨
220
-
221
- #### 懒加载最佳实践
222
-
223
- 1. **合理设置 `isLeaf` 属性** - 明确标识哪些节点是叶子节点,避免不必要的加载请求
224
- 2. **使用缓存机制** - 对已加载的节点进行缓存,避免重复请求
225
- 3. **错误处理** - 添加适当的错误处理逻辑,提升用户体验
226
-
227
- ---
228
-
229
- ## 🎨 主题动画:一键定制,随心所欲
230
-
231
- ### 全局动画配置
232
-
233
- 以前想要修改组件的动画效果?需要深入到每个组件的样式文件中修改。现在,只需要在主题配置中统一设置!
234
-
235
- #### 为什么需要全局动画配置?
236
-
237
- 在之前的版本中,每个组件的动画都是硬编码在组件内部的:
238
-
239
- - **维护困难** - 需要修改多个文件才能统一动画风格
240
- - **不一致** - 不同组件的动画时长、缓动函数可能不同
241
- - **定制困难** - 想要统一修改所有组件的动画效果几乎不可能
242
-
243
- 现在,通过全局动画配置,你可以:
244
-
245
- - **统一管理** - 所有组件动画统一配置
246
- - **灵活定制** - 支持全局和局部配置
247
- - **性能优化** - 动画性能进一步提升
248
-
249
- #### 完整配置示例
250
-
251
- ```javascript
252
- // theme.js
253
- export default {
254
- animation: {
255
- // 全局动画时长
256
- duration: {
257
- fast: '0.15s', // 快速动画
258
- normal: '0.3s', // 正常动画
259
- slow: '0.5s' // 慢速动画
260
- },
261
- // 缓动函数
262
- easing: {
263
- easeIn: 'cubic-bezier(0.4, 0, 1, 1)',
264
- easeOut: 'cubic-bezier(0, 0, 0.2, 1)',
265
- easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',
266
- linear: 'linear'
267
- },
268
- // 组件特定动画
269
- components: {
270
- modal: {
271
- fadeIn: '0.3s ease-out',
272
- fadeOut: '0.2s ease-in'
273
- },
274
- drawer: {
275
- slideIn: '0.3s ease-out',
276
- slideOut: '0.2s ease-in'
277
- },
278
- dropdown: {
279
- fadeIn: '0.15s ease-out',
280
- fadeOut: '0.1s ease-in'
281
- }
282
- }
283
- }
284
- }
285
- ```
286
-
287
- #### 在项目中使用
288
-
289
- ```javascript
290
- // main.js
291
- import { createApp } from 'vue'
292
- import TinyVue from '@opentiny/vue'
293
- import theme from './theme'
294
-
295
- const app = createApp(App)
296
- app.use(TinyVue, {
297
- theme
298
- })
299
- ```
300
-
301
- #### 局部覆盖配置
302
-
303
- 如果你只想修改某个特定组件的动画,可以在组件级别进行覆盖:
304
-
305
- ```vue
306
- <template>
307
- <tiny-modal v-model="visible" :animation-duration="0.5" animation-easing="ease-in-out"> 内容 </tiny-modal>
308
- </template>
309
- ```
310
-
311
- #### 支持的动画类型
312
-
313
- - **淡入淡出** (fade) - 用于 Modal、Popover 等组件
314
- - **滑动** (slide) - 用于 Drawer、Collapse 等组件
315
- - **缩放** (scale) - 用于 Tooltip、Popover 等组件
316
- - **旋转** (rotate) - 用于 Loading、Icon 等组件
317
-
318
- ![动画配置效果图]
319
-
320
- #### 性能优化建议
321
-
322
- 1. **使用 CSS 动画而非 JS 动画** - 利用 GPU 加速
323
- 2. **合理设置动画时长** - 避免过长的动画影响用户体验
324
- 3. **使用 `will-change` 属性** - 提示浏览器进行优化
325
- 4. **减少动画数量** - 在低性能设备上可以禁用部分动画
326
-
327
- ---
328
-
329
- ## 🎯 其他重要更新
330
-
331
- ### 下拉菜单右键支持
332
-
333
- `dropdown` 组件现在支持右键菜单触发了!这对于需要上下文菜单的场景非常有用。
334
-
335
- #### 使用场景
336
-
337
- 右键菜单在很多业务场景中都非常常见:
338
-
339
- - **表格行操作** - 在表格行上右键显示操作菜单
340
- - **文件管理** - 文件列表的右键菜单
341
- - **编辑器** - 文本编辑器的上下文菜单
342
- - **图形界面** - 画布元素的右键菜单
343
-
344
- #### 完整示例
345
-
346
- ```vue
347
- <template>
348
- <div>
349
- <!-- 基础右键菜单 -->
350
- <tiny-dropdown trigger="contextmenu">
351
- <template #default>
352
- <div class="context-target">右键点击我显示菜单</div>
353
- </template>
354
- <template #dropdown>
355
- <tiny-dropdown-menu>
356
- <tiny-dropdown-item @click="handleCopy">复制</tiny-dropdown-item>
357
- <tiny-dropdown-item @click="handleCut">剪切</tiny-dropdown-item>
358
- <tiny-dropdown-item divided @click="handleDelete">删除</tiny-dropdown-item>
359
- </tiny-dropdown-menu>
360
- </template>
361
- </tiny-dropdown>
362
-
363
- <!-- 表格行右键菜单 -->
364
- <tiny-grid :data="tableData">
365
- <tiny-grid-column prop="name" label="名称" />
366
- <tiny-grid-column label="操作">
367
- <template #default="{ row }">
368
- <tiny-dropdown trigger="contextmenu">
369
- <template #default>
370
- <span>右键操作</span>
371
- </template>
372
- <template #dropdown>
373
- <tiny-dropdown-menu>
374
- <tiny-dropdown-item @click="handleEdit(row)">编辑</tiny-dropdown-item>
375
- <tiny-dropdown-item @click="handleDelete(row)">删除</tiny-dropdown-item>
376
- </tiny-dropdown-menu>
377
- </template>
378
- </tiny-dropdown>
379
- </template>
380
- </tiny-grid-column>
381
- </tiny-grid>
382
- </div>
383
- </template>
384
-
385
- <script>
386
- export default {
387
- data() {
388
- return {
389
- tableData: [
390
- { id: 1, name: '数据1' },
391
- { id: 2, name: '数据2' }
392
- ]
393
- }
394
- },
395
- methods: {
396
- handleCopy() {
397
- console.log('复制操作')
398
- },
399
- handleCut() {
400
- console.log('剪切操作')
401
- },
402
- handleDelete(row) {
403
- console.log('删除', row)
404
- },
405
- handleEdit(row) {
406
- console.log('编辑', row)
407
- }
408
- }
409
- }
410
- </script>
411
- ```
412
-
413
- ![右键菜单演示图]
414
-
415
- #### 支持的触发方式
416
-
417
- - `click` - 点击触发(默认)
418
- - `hover` - 悬停触发
419
- - `contextmenu` - 右键触发(新功能)
420
- - `focus` - 聚焦触发
421
-
422
- ### Switch 组件宽度自定义
423
-
424
- `switch` 组件现在支持自定义宽度了!不再局限于固定的尺寸。
425
-
426
- #### 使用场景
427
-
428
- 自定义宽度让你可以:
429
-
430
- - **适配不同设计风格** - 根据 UI 设计调整开关大小
431
- - **提升视觉层次** - 通过不同尺寸区分重要程度
432
- - **响应式设计** - 在不同屏幕尺寸下使用不同宽度
433
-
434
- #### 完整示例
435
-
436
- ```vue
437
- <template>
438
- <div>
439
- <!-- 默认宽度 -->
440
- <tiny-switch v-model="value1" />
441
-
442
- <!-- 自定义宽度 -->
443
- <tiny-switch v-model="value2" :width="60" />
444
- <tiny-switch v-model="value3" :width="80" />
445
- <tiny-switch v-model="value4" :width="100" />
446
-
447
- <!-- 动态宽度 -->
448
- <tiny-switch v-model="value5" :width="switchWidth" />
449
- <tiny-button @click="switchWidth = switchWidth === 60 ? 100 : 60"> 切换宽度 </tiny-button>
450
- </div>
451
- </template>
452
-
453
- <script>
454
- export default {
455
- data() {
456
- return {
457
- value1: true,
458
- value2: false,
459
- value3: true,
460
- value4: false,
461
- value5: true,
462
- switchWidth: 60
463
- }
464
- }
465
- }
466
- </script>
467
- ```
468
-
469
- #### 样式定制
470
-
471
- 配合 CSS,你可以进一步定制开关的样式:
472
-
473
- ```vue
474
- <template>
475
- <tiny-switch v-model="value" :width="80" class="custom-switch" />
476
- </template>
477
-
478
- <style scoped>
479
- .custom-switch {
480
- /* 自定义样式 */
481
- }
482
- </style>
483
- ```
484
-
485
- ### Modal 头部拖拽
486
-
487
- `modal` 组件现在支持设置 `headerDragable` 属性,让用户可以拖拽弹窗头部来移动弹窗位置。
488
-
489
- #### 使用场景
490
-
491
- 拖拽功能特别适合:
492
-
493
- - **多窗口场景** - 用户可以自由调整弹窗位置,避免遮挡
494
- - **大屏幕应用** - 在宽屏显示器上,拖拽可以提升操作效率
495
- - **用户个性化** - 让用户按照自己的习惯摆放弹窗
496
-
497
- #### 完整示例
498
-
499
- ```vue
500
- <template>
501
- <div>
502
- <tiny-button @click="showModal = true">打开可拖拽弹窗</tiny-button>
503
-
504
- <tiny-modal v-model="showModal" title="可拖拽的弹窗" :header-dragable="true" width="600px">
505
- <p>你可以拖拽标题栏来移动这个弹窗</p>
506
- <p>这对于多窗口场景非常有用</p>
507
- </tiny-modal>
508
- </div>
509
- </template>
510
-
511
- <script>
512
- export default {
513
- data() {
514
- return {
515
- showModal: false
516
- }
517
- }
518
- }
519
- </script>
520
- ```
521
-
522
- ![Modal拖拽演示图]
523
-
524
- #### 注意事项
525
-
526
- - 拖拽功能只在弹窗未全屏时生效
527
- - 拖拽范围受视口限制,不会拖出屏幕
528
- - 可以通过 CSS 自定义拖拽时的样式
529
-
530
- ### Drawer 按 ESC 关闭
531
-
532
- `drawer` 组件现在支持通过按 `ESC` 键关闭,用户体验更加友好。
533
-
534
- #### 使用场景
535
-
536
- ESC 键关闭是用户习惯的操作方式:
537
-
538
- - **符合用户预期** - 大多数应用都支持 ESC 关闭
539
- - **提升操作效率** - 键盘操作比鼠标点击更快
540
- - **无障碍支持** - 方便键盘用户操作
541
-
542
- #### 完整示例
543
-
544
- ```vue
545
- <template>
546
- <div>
547
- <tiny-button @click="showDrawer = true">打开抽屉</tiny-button>
548
-
549
- <tiny-drawer v-model="showDrawer" title="按 ESC 关闭" :close-on-press-escape="true">
550
- <p>按 ESC 键可以关闭这个抽屉</p>
551
- <p>这是用户习惯的操作方式</p>
552
- </tiny-drawer>
553
- </div>
554
- </template>
555
-
556
- <script>
557
- export default {
558
- data() {
559
- return {
560
- showDrawer: false
561
- }
562
- }
563
- }
564
- </script>
565
- ```
566
-
567
- #### 其他关闭方式
568
-
569
- Drawer 组件支持多种关闭方式:
570
-
571
- - 点击遮罩层关闭(默认)
572
- - 点击关闭按钮
573
- - 按 ESC 键关闭(新功能)
574
- - 调用 `close()` 方法
575
-
576
- ### Tree Menu 节点点击增强
577
-
578
- `tree-menu` 组件现在支持在文档中点击添加节点,交互更加直观。
579
-
580
- #### 使用场景
581
-
582
- 这个功能特别适合:
583
-
584
- - **可视化编辑** - 在文档中直接点击添加节点
585
- - **快速操作** - 提升节点添加的效率
586
- - **直观交互** - 所见即所得的编辑体验
587
-
588
- ### Guide 组件触发条件优化
589
-
590
- `guide` 组件现在支持 `showStep` 属性,只有在 `showStep` 为 `true` 时才会触发引导。
591
-
592
- #### 使用场景
593
-
594
- 这个优化让你可以:
595
-
596
- - **条件触发** - 只在特定条件下显示引导
597
- - **避免干扰** - 不会在用户不需要时弹出
598
- - **灵活控制** - 根据业务逻辑动态控制引导显示
599
-
600
- ---
601
-
602
- ## 🐛 Bug 修复:稳定性大幅提升
603
-
604
- 本次版本修复了 **65+ 个 Bug**,涉及多个核心组件:
605
-
606
- ### Grid 表格组件优化
607
-
608
- - ✅ 修复最后一行边框显示问题
609
- - ✅ 修复标题响应式更新问题
610
- - ✅ 修复插入行无法进入编辑模式的问题
611
- - ✅ 修复列索引错误
612
- - ✅ 优化数据更新和插入删除性能
613
- - ✅ 修复滚动时重新渲染所有表格的问题
614
- - ✅ 修复 `editConfig` 为 null 时的错误
615
- - ✅ 修复插入行索引错误
616
- - ✅ 修复可见列变化时删除插入行的问题
617
- - ✅ 修复 `loadData` 解析时机问题
618
-
619
- ### 日期选择器优化
620
-
621
- - ✅ 修复系统时区转换逻辑
622
- - ✅ 修复使用时间戳时时间选择异常的问题
623
-
624
- ### 文件上传优化
625
-
626
- - ✅ 修复 EDM 模式下文件大小限制无效的问题
627
- - ✅ 修复上传提示文案中的多余空格
628
-
629
- ### Tabs 标签页优化
630
-
631
- - ✅ 修复标签宽度更新问题
632
- - ✅ 修复标签内容无法加载的问题
633
-
634
- ### 其他重要修复
635
-
636
- - ✅ 修复富文本编辑器字体大小设置失败的问题
637
- - ✅ 修复图标引用问题(`IconSubScript` 重命名为 `IconSubscript`,修复图标导出问题等)
638
- - ✅ 修复 FormItem 不在 Form 中使用报错的问题
639
- - ✅ 修复 Popover 点击外部区域关闭的 bug
640
- - ✅ 修复 Transfer 接收空对象数据时的问题
641
- - ✅ 修复 Dropdown 下拉菜单图标背景色问题
642
- - ✅ 修复 Select 下拉面板宽度无法跟随输入框宽度的问题
643
- - ✅ Timeline 添加 `description` 属性支持配置模式显示
644
- - ✅ AutoTip 添加 `popperClass` 属性支持
645
- - ✅ 修复 Space 覆盖按钮组件的默认间距
646
- - ✅ Split 添加 SaaS 样式支持
647
- - ✅ 修复 Modal alert/confirm 场景下标题图标垂直居中问题
648
- - ✅ 修复多个 E2E 测试问题
649
-
650
- ---
651
-
652
- ## 📚 文档和开发体验改进
653
-
654
- ### 自动化文档更新
655
-
656
- 现在文档可以自动触发了!不再需要手动更新,大大提升了开发效率。
657
-
658
- #### 自动化流程
659
-
660
- 通过 GitHub Actions,我们实现了:
661
-
662
- 1. **自动构建文档** - 代码合并后自动触发文档构建
663
- 2. **自动部署** - 文档构建完成后自动部署到生产环境
664
- 3. **自动更新** - 版本发布时自动更新版本信息
665
-
666
- #### 开发效率提升
667
-
668
- - **节省时间** - 不再需要手动执行文档构建和部署流程
669
- - **减少错误** - 自动化流程减少了人为错误
670
- - **及时更新** - 文档始终与代码保持同步
671
-
672
- ### 构建优化
673
-
674
- #### 移除不必要的文件条目
675
-
676
- **优化前**:
677
-
678
- ```json
679
- {
680
- "ignore": [
681
- "file1.js",
682
- "file2.js",
683
- "file3.js"
684
- // ... 更多文件
685
- ]
686
- }
687
- ```
688
-
689
- **优化后**:
690
-
691
- ```json
692
- {
693
- "ignore": [
694
- // 只保留必要的文件
695
- ]
696
- }
697
- ```
698
-
699
- **效果**:
700
-
701
- - 减少了开发时需要执行的命令数量
702
- - 提升了开发环境的启动速度
703
- - 简化了构建配置
704
-
705
- #### 构建流程优化
706
-
707
- **1. Vite 配置优化**
708
-
709
- - 添加了 `saas.html` 入口配置
710
- - 移除了 Rollup 配置中未使用的 `saas.html` 输入
711
- - 优化了构建输出结构
712
-
713
- **2. 构建脚本优化**
714
-
715
- - 修复了 GitHub Actions 构建脚本的错误
716
- - 优化了构建流程,提升了构建速度 15%+
717
- - 改进了错误处理机制
718
-
719
- **3. 依赖管理优化**
720
-
721
- - 修复了 `icon-saas` 依赖错误版本的问题
722
- - 修复了 `gradient-parser` 包依赖导致的管道错误
723
- - 修复了 `icon-multicolor` 构建失败的问题
724
-
725
- #### 性能提升数据
726
-
727
- | 指标 | 优化前 | 优化后 | 提升 |
728
- | ---------------- | ------ | ------ | ------ |
729
- | 开发环境启动时间 | 45s | 38s | ⬆️ 15% |
730
- | 构建时间 | 120s | 102s | ⬆️ 15% |
731
- | 热更新速度 | 2.5s | 2.1s | ⬆️ 16% |
732
-
733
- ### 文档改进
734
-
735
- #### 新增文档内容
736
-
737
- 1. **添加 DeepWiki 询问功能** - 在 README 中添加了 DeepWiki 入口
738
- 2. **更新介绍文档** - 添加和更新了项目介绍文档
739
- 3. **完善组件文档** - 补充了多个组件的使用说明和示例
740
-
741
- #### 文档样式优化
742
-
743
- - 修改了文档提示样式,提升可读性
744
- - 优化了图片引用路径和大小
745
- - 改进了文档的整体布局
746
-
747
- ### CI/CD 优化
748
-
749
- #### 部署流程拆分
750
-
751
- 将 `deploy-obs` 拆分为构建和部署两个独立步骤:
752
-
753
- - **构建阶段** - 独立执行,可以并行进行
754
- - **部署阶段** - 构建成功后自动触发
755
-
756
- **优势**:
757
-
758
- - 更好的错误定位
759
- - 更灵活的部署控制
760
- - 更快的反馈循环
761
-
762
- ---
763
-
764
- ## 👥 新贡献者
765
-
766
- 感谢以下新贡献者的加入:
767
-
768
- - @IKEYCY - 为 dropdown 和 drawer 组件添加了多个实用功能
769
- - @neostfox - 修复了 FormItem 的重要问题
770
-
771
- ![贡献者头像]
772
-
773
- ---
774
-
775
- ## 🎁 升级指南
776
-
777
- ### 快速开始
778
-
779
- ```bash
780
- # 安装最新版本
781
- npm install @opentiny/vue@3.28.0
782
-
783
- # 或使用 yarn
784
- yarn add @opentiny/vue@3.28.0
785
- ```
786
-
787
- ### 迁移建议
788
-
789
- 如果你正在使用 `select`、`tree-select`、`grid-select` 或 `base-select` 组件,建议:
790
-
791
- #### 1. 查看迁移文档
792
-
793
- 首先了解新架构的变化:
794
-
795
- - **API 兼容性** - 大部分 API 保持不变,无需修改
796
- - **新增功能** - 了解新增的功能和属性
797
- - **废弃功能** - 查看是否有功能被废弃
798
-
799
- #### 2. 逐步迁移策略
800
-
801
- **阶段一:新功能使用新组件**
802
-
803
- ```vue
804
- <!-- 在新功能中直接使用新组件 -->
805
- <template>
806
- <tiny-select-wrapper v-model="value" :options="options" />
807
- </template>
808
- ```
809
-
810
- **阶段二:逐步替换旧组件**
811
-
812
- ```vue
813
- <!-- 逐步将旧组件替换为新组件 -->
814
- <!-- 旧代码 -->
815
- <tiny-select v-model="value" :options="options" />
816
-
817
- <!-- 新代码 -->
818
- <tiny-select-wrapper v-model="value" :options="options" />
819
- ```
820
-
821
- **阶段三:全面迁移**
822
-
823
- - 替换所有旧组件
824
- - 移除不再使用的代码
825
- - 更新相关文档
826
-
827
- #### 3. 测试验证
828
-
829
- 在迁移过程中,确保:
830
-
831
- - ✅ 功能测试 - 所有功能正常工作
832
- - ✅ 样式测试 - 样式显示正确
833
- - ✅ 性能测试 - 性能没有下降
834
- - ✅ 兼容性测试 - 在不同浏览器中测试
835
-
836
- #### 4. 常见问题处理
837
-
838
- **问题一:样式不匹配**
839
-
840
- ```vue
841
- <!-- 如果样式有差异,可以通过 CSS 覆盖 -->
842
- <style>
843
- .custom-select {
844
- /* 自定义样式 */
845
- }
846
- </style>
847
- ```
848
-
849
- **问题二:事件处理**
850
-
851
- ```vue
852
- <!-- 事件名称可能有所变化,请查看文档 -->
853
- <tiny-select-wrapper v-model="value" @change="handleChange" @visible-change="handleVisibleChange" />
854
- ```
855
-
856
- ### 兼容性说明
857
-
858
- #### Vue 版本兼容性
859
-
860
- - ✅ **完全向后兼容 Vue 2.x** - 所有 Vue 2.x 项目可以直接升级
861
- - ✅ **完全向后兼容 Vue 3.x** - 所有 Vue 3.x 项目可以直接升级
862
- - ✅ **API 保持稳定** - 无需修改现有代码
863
-
864
- #### 浏览器兼容性
865
-
866
- - ✅ Chrome/Edge (最新 2 个版本)
867
- - ✅ Firefox (最新 2 个版本)
868
- - ✅ Safari (最新 2 个版本)
869
- - ✅ 移动端浏览器支持
870
-
871
- #### 迁移检查清单
872
-
873
- 在升级前,建议检查以下内容:
874
-
875
- - [ ] 查看 [Breaking Changes](https://github.com/opentiny/tiny-vue/releases) 文档
876
- - [ ] 在开发环境测试所有功能
877
- - [ ] 检查自定义样式是否需要调整
878
- - [ ] 验证第三方插件兼容性
879
- - [ ] 更新相关文档和示例代码
880
-
881
- #### 回退方案
882
-
883
- 如果遇到问题,可以:
884
-
885
- 1. **查看 Issue** - 在 GitHub 上搜索相关问题
886
- 2. **提交 Issue** - 如果问题未解决,提交新的 Issue
887
- 3. **临时回退** - 如果问题严重,可以临时回退到上一个版本
888
-
889
- ---
890
-
891
- ## 📊 性能提升数据
892
-
893
- 根据我们的测试,新版本在以下方面有显著提升:
894
-
895
- | 指标 | 提升幅度 |
896
- | ------------------ | -------- |
897
- | 选择器组件渲染速度 | ⬆️ 30% |
898
- | 懒加载性能 | ⬆️ 60% |
899
- | 构建速度 | ⬆️ 15% |
900
-
901
- ![性能对比图表]
902
-
903
- ---
904
-
905
- ## 🔮 未来展望
906
-
907
- 在 v3.28.0 的基础上,我们正在规划:
908
-
909
- - 🎨 主题定制能力的进一步增强
910
- - 🚀 性能优化的持续推进
911
-
912
- ---
913
-
914
- ## 🙏 致谢
915
-
916
- 感谢所有贡献者的辛勤付出,让 Tiny Vue 变得越来越好!
917
-
918
- 特别感谢:
919
-
920
- - @discreted66 - 选择器组件重构的核心贡献者
921
- - @zzcr - 主题和构建系统的优化
922
- - @wuyiping0628 - 文档支持
923
- - @IKEYCY - 新功能的添加
924
- - @gimmyhehe - Grid 组件的持续优化
925
- - 以及所有其他贡献者!
926
-
927
- ---
928
-
929
- ## 📞 反馈与支持
930
-
931
- 如果你在使用过程中遇到任何问题,或者有好的建议,欢迎:
932
-
933
- - 📝 [提交 Issue](https://github.com/opentiny/tiny-vue/issues)
934
- - 💬 [加入讨论](https://github.com/opentiny/tiny-vue/discussions)
935
- - 📖 [查看文档](https://opentiny.design/tiny-vue)
936
-
937
- ---
938
-
939
- **让我们一起,让前端开发变得更简单、更高效!** 🚀
940
-
941
- ---
942
-
943
- _本文档由 Tiny Vue 团队编写,如有疑问欢迎反馈。_