@ebiz/designer-components 0.0.18-tj.1 → 0.0.19-beta.1

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.
Files changed (70) hide show
  1. package/dist/designer-components.css +1 -1
  2. package/dist/index.mjs +66100 -52710
  3. package/package.json +1 -1
  4. package/src/apiService/mockDataService.js +116 -0
  5. package/src/apiService/simpleDataService.js +186 -80
  6. package/src/components/Button.vue +72 -22
  7. package/src/components/EbizAvatar.vue +116 -0
  8. package/src/components/EbizCheckbox.vue +94 -0
  9. package/src/components/EbizCheckboxGroup.vue +70 -0
  10. package/src/components/EbizDetailBlock.vue +82 -0
  11. package/src/components/EbizDialog.vue +249 -0
  12. package/src/components/EbizEmployeeInfo.vue +139 -0
  13. package/src/components/EbizPageHeader.vue +96 -0
  14. package/src/components/EbizPagination.vue +163 -0
  15. package/src/components/EbizRadio.vue +87 -0
  16. package/src/components/EbizRadioGroup.vue +84 -0
  17. package/src/components/EbizRemoteSelect.vue +107 -41
  18. package/src/components/EbizStatistic.vue +150 -0
  19. package/src/components/EbizSwiper.vue +3 -3
  20. package/src/components/EbizSwitch.vue +86 -0
  21. package/src/components/EbizTabHeader.vue +6 -10
  22. package/src/components/EbizTabPanel.vue +23 -0
  23. package/src/components/EbizTable.vue +466 -0
  24. package/src/components/EbizTableColumn.vue +117 -0
  25. package/src/components/EbizTableSort.vue +181 -0
  26. package/src/components/EbizTabs.vue +143 -0
  27. package/src/components/EbizTimePicker.vue +144 -0
  28. package/src/components/EbizTitle.vue +36 -37
  29. package/src/components/EbizTree.vue +153 -0
  30. package/src/components/EbizTreeSelector.vue +418 -0
  31. package/src/components/TdesignAlert.vue +116 -0
  32. package/src/components/TdesignCalendar/index.vue +6 -3
  33. package/src/components/TdesignCol.vue +102 -0
  34. package/src/components/TdesignDialog.vue +226 -0
  35. package/src/components/TdesignGrid.vue +56 -0
  36. package/src/components/TdesignInput.vue +23 -23
  37. package/src/components/TdesignTextarea.vue +143 -0
  38. package/src/components/TdesignTimeline.vue +58 -0
  39. package/src/components/TdesignTimelineItem.vue +72 -0
  40. package/src/components/TdesignUpload.vue +757 -0
  41. package/src/components/TdesignWatermark.vue +108 -0
  42. package/src/index.js +85 -0
  43. package/src/main.js +2 -2
  44. package/src/router/index.js +160 -5
  45. package/src/views/Button.vue +7 -3
  46. package/src/views/CheckboxDemo.vue +105 -0
  47. package/src/views/DialogDemo.vue +126 -0
  48. package/src/views/EbizAvatar.vue +224 -0
  49. package/src/views/EbizDetailBlockDemo.vue +31 -0
  50. package/src/views/EbizEmployeeInfo.vue +250 -0
  51. package/src/views/EbizRadioDemo.vue +152 -0
  52. package/src/views/GridDemo.vue +239 -0
  53. package/src/views/Home.vue +49 -2
  54. package/src/views/PageHeaderDemo.vue +105 -0
  55. package/src/views/PaginationDemo.vue +97 -0
  56. package/src/views/RemoteSelect.vue +336 -5
  57. package/src/views/StatisticDemo.vue +191 -0
  58. package/src/views/SwitchDemo.vue +80 -0
  59. package/src/views/TableDemo.vue +335 -0
  60. package/src/views/TableSortDemo.vue +144 -0
  61. package/src/views/TableView.vue +69 -0
  62. package/src/views/TabsDemo.vue +283 -0
  63. package/src/views/TdesignAlert.vue +99 -0
  64. package/src/views/TextareaDemo.vue +94 -0
  65. package/src/views/TimePickerDemo.vue +147 -0
  66. package/src/views/TimelineDemo.vue +161 -0
  67. package/src/views/TreeDemo.vue +255 -0
  68. package/src/views/TreeSelectorDemo.vue +246 -0
  69. package/src/views/UploadDemo.vue +122 -0
  70. package/src/views/WatermarkDemo.vue +86 -0
@@ -0,0 +1,226 @@
1
+ <template>
2
+ <t-dialog v-model:visible="isVisible" :attach="attach" :body="body" :cancel-btn="cancelBtn" :close-btn="closeBtn"
3
+ :close-on-esc-keydown="closeOnEscKeydown" :close-on-overlay-click="closeOnOverlayClick"
4
+ :confirm-btn="confirmBtn" :default-visible="defaultVisible" :destroy-on-close="destroyOnClose"
5
+ :draggable="draggable" :footer="footer" :header="header" :mode="mode" :placement="placement"
6
+ :show-overlay="showOverlay" :width="width" :z-index="zIndex" @cancel="handleCancel" @close="handleClose"
7
+ @close-btn-click="handleCloseBtnClick" @confirm="handleConfirm" @esc-keydown="handleEscKeydown"
8
+ @overlay-click="handleOverlayClick" @opened="handleOpened" @closed="handleClosed"
9
+ @update:visible="handleUpdateVisible">
10
+ <!-- 头部插槽 -->
11
+ <template v-if="$slots.header" #header>
12
+ <slot name="header"></slot>
13
+ </template>
14
+
15
+ <!-- 内容插槽 -->
16
+ <template v-if="$slots.body" #body>
17
+ <slot name="body"></slot>
18
+ </template>
19
+
20
+ <!-- 默认插槽 -->
21
+ <slot></slot>
22
+
23
+ <!-- 页脚插槽 -->
24
+ <template v-if="$slots.footer" #footer>
25
+ <slot name="footer"></slot>
26
+ </template>
27
+
28
+ <!-- 取消按钮插槽 -->
29
+ <template v-if="$slots.cancelBtn" #cancel-btn>
30
+ <slot name="cancelBtn"></slot>
31
+ </template>
32
+
33
+ <!-- 确认按钮插槽 -->
34
+ <template v-if="$slots.confirmBtn" #confirm-btn>
35
+ <slot name="confirmBtn"></slot>
36
+ </template>
37
+ </t-dialog>
38
+ </template>
39
+
40
+ <script>
41
+ export default {
42
+ name: "EbizDialog"
43
+ }
44
+ </script>
45
+
46
+ <script setup>
47
+ import { ref, watch } from 'vue';
48
+ import { Dialog as TDialog } from 'tdesign-vue-next';
49
+
50
+ // 定义属性
51
+ const props = defineProps({
52
+ // 对话框挂载的节点
53
+ attach: {
54
+ type: [String, Function, Element],
55
+ default: 'body'
56
+ },
57
+ // 对话框内容
58
+ body: {
59
+ type: [String, Function],
60
+ default: ''
61
+ },
62
+ // 取消按钮,可自定义。值为 null 则不显示取消按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性
63
+ cancelBtn: {
64
+ type: [String, Object, null],
65
+ default: ''
66
+ },
67
+ // 关闭按钮,值为 true 显示默认关闭按钮;值为 false 则不显示关闭按钮;值类型为 string 则直接显示值;值类型为 TNode,则显示自定义按钮
68
+ closeBtn: {
69
+ type: [Boolean, String, Function],
70
+ default: true
71
+ },
72
+ // 按下 ESC 时是否触发对话框关闭
73
+ closeOnEscKeydown: {
74
+ type: Boolean,
75
+ default: undefined
76
+ },
77
+ // 点击蒙层时是否触发关闭
78
+ closeOnOverlayClick: {
79
+ type: Boolean,
80
+ default: undefined
81
+ },
82
+ // 确认按钮,可自定义。值为 null 则不显示确认按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性
83
+ confirmBtn: {
84
+ type: [String, Object, null],
85
+ default: ''
86
+ },
87
+ // 对话框默认是否显示
88
+ defaultVisible: {
89
+ type: Boolean,
90
+ default: false
91
+ },
92
+ // 是否在关闭弹框的时候销毁子元素
93
+ destroyOnClose: {
94
+ type: Boolean,
95
+ default: false
96
+ },
97
+ // 对话框是否可以拖拽
98
+ draggable: {
99
+ type: Boolean,
100
+ default: false
101
+ },
102
+ // 底部操作栏,默认会有"确认"和"取消"两个按钮
103
+ footer: {
104
+ type: [Boolean, Function],
105
+ default: true
106
+ },
107
+ // 头部内容
108
+ header: {
109
+ type: [String, Boolean, Function],
110
+ default: true
111
+ },
112
+ // 对话框类型
113
+ mode: {
114
+ type: String,
115
+ default: 'modal',
116
+ validator: (val) => ['modal', 'modeless', 'full-screen'].includes(val)
117
+ },
118
+ // 对话框位置,类似 CSS 中的 position
119
+ placement: {
120
+ type: String,
121
+ default: 'top',
122
+ validator: (val) => ['top', 'center'].includes(val)
123
+ },
124
+ // 是否显示遮罩层
125
+ showOverlay: {
126
+ type: Boolean,
127
+ default: true
128
+ },
129
+ // 控制对话框显示与隐藏
130
+ visible: {
131
+ type: Boolean,
132
+ default: undefined
133
+ },
134
+ // 对话框宽度
135
+ width: {
136
+ type: [String, Number],
137
+ default: undefined
138
+ },
139
+ // 对话框层级
140
+ zIndex: {
141
+ type: Number,
142
+ default: undefined
143
+ }
144
+ });
145
+
146
+ // 显示状态
147
+ const isVisible = ref(props.visible);
148
+
149
+ // 监听visible属性变化
150
+ watch(() => props.visible, (newValue) => {
151
+ isVisible.value = newValue;
152
+ });
153
+
154
+ // 定义事件
155
+ const emit = defineEmits([
156
+ 'cancel',
157
+ 'close',
158
+ 'close-btn-click',
159
+ 'confirm',
160
+ 'esc-keydown',
161
+ 'overlay-click',
162
+ 'opened',
163
+ 'closed',
164
+ 'update:visible'
165
+ ]);
166
+
167
+ // 取消按钮点击事件
168
+ const handleCancel = (e) => {
169
+ emit('cancel', { e });
170
+ emit('close', { trigger: 'cancel', e });
171
+ emit('update:visible', false);
172
+ };
173
+
174
+ // 关闭事件
175
+ const handleClose = (context) => {
176
+ emit('close', context);
177
+ emit('update:visible', false);
178
+ };
179
+
180
+ // 关闭按钮点击事件
181
+ const handleCloseBtnClick = (e) => {
182
+ emit('close-btn-click', { e });
183
+ emit('close', { trigger: 'close-btn', e });
184
+ emit('update:visible', false);
185
+ };
186
+
187
+ // 确认按钮点击事件
188
+ const handleConfirm = (e) => {
189
+ emit('confirm', { e });
190
+ emit('update:visible', false);
191
+ };
192
+
193
+ // ESC 按键按下事件
194
+ const handleEscKeydown = (e) => {
195
+ emit('esc-keydown', { e });
196
+ emit('close', { trigger: 'esc', e });
197
+ emit('update:visible', false);
198
+ };
199
+
200
+ // 遮罩层点击事件
201
+ const handleOverlayClick = (e) => {
202
+ emit('overlay-click', { e });
203
+ emit('close', { trigger: 'overlay', e });
204
+ emit('update:visible', false);
205
+ };
206
+
207
+ // 对话框打开完成事件
208
+ const handleOpened = () => {
209
+ emit('opened');
210
+ };
211
+
212
+ // 对话框关闭完成事件
213
+ const handleClosed = () => {
214
+ emit('closed');
215
+ };
216
+
217
+ // 更新可见状态
218
+ const handleUpdateVisible = (visible) => {
219
+ isVisible.value = visible;
220
+ emit('update:visible', visible);
221
+ };
222
+ </script>
223
+
224
+ <style lang="less" scoped>
225
+ /* 自定义样式 */
226
+ </style>
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <t-row
3
+ :align="align"
4
+ :justify="justify"
5
+ :gutter="gutter"
6
+ :tag="tag"
7
+ :gap="gap"
8
+ >
9
+ <slot></slot>
10
+ </t-row>
11
+ </template>
12
+
13
+ <script>
14
+ export default {
15
+ name: "EbizGrid"
16
+ }
17
+ </script>
18
+
19
+ <script setup>
20
+ import { defineProps, defineEmits } from 'vue';
21
+ import { Row as TRow } from 'tdesign-vue-next';
22
+
23
+ defineProps({
24
+ // 垂直对齐方式
25
+ align: {
26
+ type: String,
27
+ default: undefined,
28
+ validator: (val) => ['start', 'end', 'center', 'stretch', 'baseline'].includes(val)
29
+ },
30
+ // 水平排列方式
31
+ justify: {
32
+ type: String,
33
+ default: undefined,
34
+ validator: (val) => ['start', 'end', 'center', 'space-around', 'space-between'].includes(val)
35
+ },
36
+ // 栅格间隔,示例:16、[16, 16]
37
+ gutter: {
38
+ type: [Number, Array, Object],
39
+ default: 0
40
+ },
41
+ // 自定义元素标签
42
+ tag: {
43
+ type: String,
44
+ default: 'div'
45
+ },
46
+ // 间隔,示例:'0'、'xs' 或 { xs: '4px', sm: '6px', md: '12px' }
47
+ gap: {
48
+ type: [String, Number, Object, Array],
49
+ default: undefined
50
+ }
51
+ });
52
+ </script>
53
+
54
+ <style lang="less" scoped>
55
+ /* 自定义样式 */
56
+ </style>
@@ -181,60 +181,60 @@ const emit = defineEmits([
181
181
  ]);
182
182
 
183
183
  // 处理输入事件
184
- const handleInput = (value, { e }) => {
185
- emit('update:modelValue', value);
186
- emit('input', value, { e });
184
+ const handleInput = (value, context) => {
185
+ emit('input', value, context);
187
186
  };
188
187
 
189
188
  // 处理变化事件
190
- const handleChange = (value, { e }) => {
191
- emit('change', value, { e });
189
+ const handleChange = (value, context) => {
190
+ emit('update:modelValue', value);
191
+ emit('change', value, context);
192
192
  };
193
193
 
194
194
  // 处理失去焦点事件
195
- const handleBlur = (value, { e }) => {
196
- emit('blur', value, { e });
195
+ const handleBlur = (value, context) => {
196
+ emit('blur', value, context);
197
197
  };
198
198
 
199
199
  // 处理获取焦点事件
200
- const handleFocus = (value, { e }) => {
201
- emit('focus', value, { e });
200
+ const handleFocus = (value, context) => {
201
+ emit('focus', value, context);
202
202
  };
203
203
 
204
204
  // 处理回车事件
205
- const handleEnter = (value, { e }) => {
206
- emit('enter', value, { e });
205
+ const handleEnter = (value, context) => {
206
+ emit('enter', value, context);
207
207
  };
208
208
 
209
209
  // 处理清空事件
210
- const handleClear = ({ e }) => {
210
+ const handleClear = (context) => {
211
211
  emit('update:modelValue', '');
212
- emit('clear', { e });
212
+ emit('clear', context);
213
213
  };
214
214
 
215
215
  // 处理键盘按下事件
216
- const handleKeydown = (value, { e }) => {
217
- emit('keydown', value, { e });
216
+ const handleKeydown = (value, context) => {
217
+ emit('keydown', value, context);
218
218
  };
219
219
 
220
220
  // 处理键盘按键事件
221
- const handleKeypress = (value, { e }) => {
222
- emit('keypress', value, { e });
221
+ const handleKeypress = (value, context) => {
222
+ emit('keypress', value, context);
223
223
  };
224
224
 
225
225
  // 处理键盘弹起事件
226
- const handleKeyup = (value, { e }) => {
227
- emit('keyup', value, { e });
226
+ const handleKeyup = (value, context) => {
227
+ emit('keyup', value, context);
228
228
  };
229
229
 
230
230
  // 处理鼠标进入事件
231
- const handleMouseenter = (value, { e }) => {
232
- emit('mouseenter', value, { e });
231
+ const handleMouseenter = (value, context) => {
232
+ emit('mouseenter', value, context);
233
233
  };
234
234
 
235
235
  // 处理鼠标离开事件
236
- const handleMouseleave = (value, { e }) => {
237
- emit('mouseleave', value, { e });
236
+ const handleMouseleave = (value, context) => {
237
+ emit('mouseleave', value, context);
238
238
  };
239
239
  </script>
240
240
 
@@ -0,0 +1,143 @@
1
+ <template>
2
+ <t-textarea
3
+ :value="modelValue"
4
+ :disabled="disabled"
5
+ :readonly="readonly"
6
+ :placeholder="placeholder"
7
+ :autofocus="autofocus"
8
+ :autosize="autosize"
9
+ :max-character="maxCharacter"
10
+ :max-length="maxLength"
11
+ :max-rows="maxRows"
12
+ :status="status"
13
+ :tips="tips"
14
+ :default-value="defaultValue"
15
+ @blur="handleBlur"
16
+ @change="handleChange"
17
+ @focus="handleFocus"
18
+ @keydown="handleKeydown"
19
+ @keypress="handleKeypress"
20
+ @keyup="handleKeyup"
21
+ @validate="handleValidate"
22
+ >
23
+ <!-- 默认插槽 -->
24
+ <slot></slot>
25
+ </t-textarea>
26
+ </template>
27
+
28
+ <script>
29
+ export default {
30
+ name: "EbizTextarea"
31
+ }
32
+ </script>
33
+
34
+ <script setup>
35
+ import { defineProps, defineEmits } from 'vue';
36
+ import { Textarea as TTextarea } from 'tdesign-vue-next';
37
+
38
+ const props = defineProps({
39
+ // 文本框值(v-model)
40
+ modelValue: {
41
+ type: [String, Number],
42
+ default: ''
43
+ },
44
+ // 文本框默认值
45
+ defaultValue: {
46
+ type: [String, Number],
47
+ default: ''
48
+ },
49
+ // 是否禁用文本框
50
+ disabled: {
51
+ type: Boolean,
52
+ default: false
53
+ },
54
+ // 是否只读
55
+ readonly: {
56
+ type: Boolean,
57
+ default: false
58
+ },
59
+ // 文本框占位符
60
+ placeholder: {
61
+ type: String,
62
+ default: ''
63
+ },
64
+ // 是否自动聚焦
65
+ autofocus: {
66
+ type: Boolean,
67
+ default: false
68
+ },
69
+ // 是否自动调整高度
70
+ autosize: {
71
+ type: [Boolean, Object],
72
+ default: false
73
+ },
74
+ // 用于控制组件是否显示最大字符数,值为 true 会显示组件字符数最大值
75
+ maxCharacter: {
76
+ type: [Number, Boolean],
77
+ default: false
78
+ },
79
+ // 用于控制输入框最大可输入的字符个数
80
+ maxLength: {
81
+ type: Number,
82
+ default: undefined
83
+ },
84
+ // 最大行数,当超出最大行数时,会自动出现滚动条
85
+ maxRows: {
86
+ type: Number,
87
+ default: undefined
88
+ },
89
+ // 文本框状态
90
+ status: {
91
+ type: String,
92
+ default: 'default',
93
+ validator: (val) => ['default', 'success', 'warning', 'error'].includes(val)
94
+ },
95
+ // 输入框下方提示文本
96
+ tips: {
97
+ type: [String, Function],
98
+ default: ''
99
+ }
100
+ });
101
+
102
+ const emit = defineEmits(['update:modelValue', 'blur', 'change', 'focus', 'keydown', 'keypress', 'keyup', 'validate']);
103
+
104
+ // 失去焦点事件
105
+ const handleBlur = (value, context) => {
106
+ emit('blur', value, context);
107
+ };
108
+
109
+ // 输入内容变化事件
110
+ const handleChange = (value, context) => {
111
+ emit('update:modelValue', value);
112
+ emit('change', value, context);
113
+ };
114
+
115
+ // 获得焦点事件
116
+ const handleFocus = (value, context) => {
117
+ emit('focus', value, context);
118
+ };
119
+
120
+ // 键盘按下事件
121
+ const handleKeydown = (value, context) => {
122
+ emit('keydown', value, context);
123
+ };
124
+
125
+ // 按下字符键事件
126
+ const handleKeypress = (value, context) => {
127
+ emit('keypress', value, context);
128
+ };
129
+
130
+ // 释放键盘事件
131
+ const handleKeyup = (value, context) => {
132
+ emit('keyup', value, context);
133
+ };
134
+
135
+ // 字数超出限制事件
136
+ const handleValidate = (context) => {
137
+ emit('validate', context);
138
+ };
139
+ </script>
140
+
141
+ <style lang="less" scoped>
142
+ /* 自定义样式 */
143
+ </style>
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <t-timeline
3
+ :layout="layout"
4
+ :labelAlign="labelAlign"
5
+ :mode="mode"
6
+ :reverse="reverse"
7
+ :theme="theme"
8
+ >
9
+ <slot></slot>
10
+ </t-timeline>
11
+ </template>
12
+
13
+ <script>
14
+ export default {
15
+ name: "EbizTimeline"
16
+ }
17
+ </script>
18
+
19
+ <script setup>
20
+ import { defineProps, defineEmits } from 'vue';
21
+ import { Timeline as TTimeline } from 'tdesign-vue-next';
22
+
23
+ defineProps({
24
+ // 布局方向
25
+ layout: {
26
+ type: String,
27
+ default: 'vertical',
28
+ validator: (val) => ['horizontal', 'vertical'].includes(val)
29
+ },
30
+ // 标签位置
31
+ labelAlign: {
32
+ type: String,
33
+ default: 'auto',
34
+ validator: (val) => ['left', 'right', 'top', 'bottom', 'auto'].includes(val)
35
+ },
36
+ // 展示类型
37
+ mode: {
38
+ type: String,
39
+ default: 'alternate',
40
+ validator: (val) => ['alternate', 'same', 'left', 'right'].includes(val)
41
+ },
42
+ // 是否倒序排列
43
+ reverse: {
44
+ type: Boolean,
45
+ default: false
46
+ },
47
+ // 主题风格
48
+ theme: {
49
+ type: String,
50
+ default: 'default',
51
+ validator: (val) => ['default', 'dot'].includes(val)
52
+ }
53
+ });
54
+ </script>
55
+
56
+ <style lang="less" scoped>
57
+ /* 自定义样式 */
58
+ </style>
@@ -0,0 +1,72 @@
1
+ <template>
2
+ <t-timeline-item
3
+ :content="content"
4
+ :dot="dot"
5
+ :dotColor="dotColor"
6
+ :label="label"
7
+ :labelAlign="labelAlign"
8
+ :loading="loading"
9
+ >
10
+ <!-- 时间轴点内容插槽 -->
11
+ <template v-if="$slots.dot" #dot>
12
+ <slot name="dot"></slot>
13
+ </template>
14
+
15
+ <!-- 标签内容插槽 -->
16
+ <template v-if="$slots.label" #label>
17
+ <slot name="label"></slot>
18
+ </template>
19
+
20
+ <!-- 默认插槽 -->
21
+ <slot>{{ content }}</slot>
22
+ </t-timeline-item>
23
+ </template>
24
+
25
+ <script>
26
+ export default {
27
+ name: "EbizTimelineItem"
28
+ }
29
+ </script>
30
+
31
+ <script setup>
32
+ import { defineProps } from 'vue';
33
+ import { TimelineItem as TTimelineItem } from 'tdesign-vue-next';
34
+
35
+ defineProps({
36
+ // 内容
37
+ content: {
38
+ type: String,
39
+ default: ''
40
+ },
41
+ // 时间轴点内容,可以是组件
42
+ dot: {
43
+ type: [String, Function],
44
+ default: ''
45
+ },
46
+ // 时间轴点颜色,内置 primary/warning/error/default 四种色值
47
+ dotColor: {
48
+ type: String,
49
+ default: ''
50
+ },
51
+ // 标签文本内容
52
+ label: {
53
+ type: String,
54
+ default: ''
55
+ },
56
+ // 标签位置,优先级高于 Timeline 中的 labelAlign
57
+ labelAlign: {
58
+ type: String,
59
+ default: '',
60
+ validator: (val) => ['left', 'right', 'top', 'bottom', 'auto', ''].includes(val)
61
+ },
62
+ // 是否处于加载状态
63
+ loading: {
64
+ type: Boolean,
65
+ default: false
66
+ }
67
+ });
68
+ </script>
69
+
70
+ <style lang="less" scoped>
71
+ /* 自定义样式 */
72
+ </style>