hw-cus-ui 1.1.21 → 1.1.23

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.
@@ -90,144 +90,119 @@
90
90
  </view>
91
91
  </template>
92
92
 
93
- <script setup>
93
+ <script lang="ts" setup>
94
94
  import { ref, onMounted, watch, nextTick } from 'vue';
95
95
 
96
- const props = defineProps({
97
- range: {
98
- type: Array,
99
- default: []
100
- },
101
- rangeNext: {
102
- type: Array,
103
- default: []
104
- },
105
- request: {
106
- type: Function,
107
- default: null
108
- },
109
- idKey: {
110
- //字段key值
111
- type: String,
112
- default: 'id'
113
- },
114
- // 字符串或者字符串数组
115
- modelValue: {
116
- type: String,
117
- default: ''
118
- },
119
- nameKey: {
120
- //字段value值
121
- type: String,
122
- default: 'name'
123
- },
124
- allKey: {
125
- //冗余字段
126
- type: String,
127
- default: 'value'
128
- },
129
- placeholder: {
130
- //冗余字段
131
- type: String,
132
- default: '请选择'
133
- },
134
- title: {
135
- //头
136
- type: String,
137
- default: ''
138
- },
139
- multiple: {
140
- // 是否可以多选
141
- type: Boolean,
142
- default: true
143
- // default: true
144
- },
145
- isSearch: {
146
- type: Boolean,
147
- default: false
148
- },
149
- disabled: {
150
- // 是否禁用
151
- type: Boolean,
152
- default: false
153
- },
154
- cascade: {
155
- // 是否级联选择
156
- type: Boolean,
157
- default: false
158
- // default: true
159
- },
160
- isShowLabel: {
161
- // 是否显示标题
162
- type: Boolean,
163
- default: true
164
- },
165
- selectParent: {
166
- //是否可以选父级
167
- type: Boolean,
168
- default: true
169
- },
170
- foldAll: {
171
- //折叠时关闭所有已经打开的子集,再次打开时需要一级一级打开
172
- type: Boolean,
173
- default: false
174
- },
175
- confirmColor: {
176
- // 确定按钮颜色
177
- type: String,
178
- default: '#007aff' // #1facac
179
- },
180
- cancelColor: {
181
- // 取消按钮颜色
182
- type: String,
183
- default: '#757575' // #757575
184
- },
185
- titleColor: {
186
- // 标题颜色
187
- type: String,
188
- default: '#757575' // #757575
189
- },
190
- currentIcon: {
191
- // 展开时候的ic
192
- type: String,
193
- default:
194
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAABRCAYAAACqj0o2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEQ0QTM0MzQ1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEQ0QTM0MzU1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRDRBMzQzMjVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRDRBMzQzMzVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PidwepsAAAK0SURBVHja7JxbTsJAFIYHww7ciStgCeoGvGxAiOsgURegoL5720AXYLiIr0aJviq3Zx3PhIEnKG3ndtr+f3KixrSUj/ZjzjClIqUUiFm2gAAQAREQEUAEREAERAQQAREQAREBREAEREBEEqa67h9RFDWllDv0awWYlqlQHmu1WjMRRMoV1QFttA12y3xRtdNczq8EsE4/f8FumX2q77ROvNXk8UGMEKdUz6tYJHljaZAbuyUH+UR1to5BEohTuqwPCeS4pAA/qY6o/kyHOAMCeRK3owJnj+rH1jjxhqpVsstaebCz6TmnHWyXyY+xHjSBWBY/bvSgadtXBj9u9KCN3rnIfkzkQVsTEEX0Y2IP2oKo/HhMICcFAThUcwVZNGU6FdbX/XURzkbVF4+ybGhjPrFdgP66QdXNurGtSdk6Xdb9nAJ8oDo3OQlsQZzkdPw41ONBo6vI5scDefRjZg+6gpg3Pxp50CXEvPjR2IOuIXL3oxUPuobI3Y9WPOgDIlc/WvOgL4iL/vqFCcD7LH0xB4hj7cfQ/fWH9qCT+FhG0tN+DBk1PzjOM0SVllixcsBT1AvYc/kAPhc0hRg/3uvxoCgKRN9+dOrBUBB9+9GpB0NC9OVH5x4MDdG1H714kANEV3705kEOEBf9dcPi/lQnsuvLg1wgSu3Ha0v7Uh4MMgUXeuG71H407a+VBy9CPQkOdw+MtB+nGbd/D+FBbhBNxo9SjwcngJjNj0E9yBFiFj8G9SBXiGn8GNyDnCEm8SMLD3KHGOdHNh7kDjHOj2w8mAeIi/5arX+c6b/fxHz9oADEdGdjR/fXCw/OOB5oVfCOgnepz8IB14PMw03jCmTE+QBx5z0gAmKSqK9OUF+hcAeIhu/QYr4Qie8rjW83hhMBERARQAREQAREBBABERCLnH8BBgA+TQI7U4t53AAAAABJRU5ErkJggg=='
195
- },
196
- defaultIcon: {
197
- // 折叠时候的ic
198
- type: String,
199
- default:
200
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAABRCAYAAACqj0o2AAACE0lEQVR4Xu3c200DMRCF4XEltJAOkEugA+ggpUAHoQMqiFMCdEAJUMEiS4mEELlIO7bPOeN9i6K1rG/952myyea1WiCtXmEuYBPR4RBMxInoIOCwhOtJLKVszWyXc/5y2BvNEq6I+/3+kFK6M7OHnPM7jcLKjbZAvD/uaZtzflm5P4rbWyJWgDcze1LPuzVihfxUz7sH4ilJ2bx7Isrm3RtRMu8RiHJ5j0SUyXs0okTeCIj0eSMh0uaNhkiZNyIiXd7IiDR5oyNS5M2ACJ83EyJs3myIkHkzIsLlzYwIkzc7IkTeCojD81ZCHJa3GuKQvBURu+etjNgtb3XELnlHQGyedyTEZnlHQ2ySd0RE97wjI7rlHR3RJe+JeIrbLOecD6ePpZQ6W1kn2epo4MUrPOKyLN8ppYq1+y1VStncOjIdGnFZlo+U0uOtWOeOY2TE12Ouq//pEA7xXL7XfvcufR8K0Svfv6CREN3yDYfYIt9QiK3yjYTYLF95xB75SiP2ylcZsVu+cogj8pVCHJWvEuKwfOkREfKlRkTJlxkRJl86RMR8qRBR82VChM0XHpEhX2hElnyREWnyhUNkzBcKkTVfJETafIcjKuQ7FFEl35GIMvl2R1TMtyuiar49EWXzbY5oZpv/hibXTF2h3+s60FRKeT6+3TjMS3nrA3ZFRD8xrfY3ER1kJ+JEdBBwWGKeRAfEH1wS5WFZSDB/AAAAAElFTkSuQmCC'
201
- },
202
- lastIcon: {
203
- // 没有子集的ic
204
- type: String,
205
- default: ''
206
- }
96
+ // 树节点接口
97
+ interface TreeNode {
98
+ id: string | number;
99
+ name: string;
100
+ value?: any;
101
+ children?: TreeNode[];
102
+ [key: string]: any;
103
+ }
104
+
105
+ // 树列表项接口
106
+ interface TreeListItem {
107
+ id: string | number;
108
+ name: string;
109
+ value: any;
110
+ source: any;
111
+ parentId: (string | number)[];
112
+ parents: any[];
113
+ rank: number;
114
+ showChild: boolean;
115
+ open: boolean;
116
+ show: boolean;
117
+ hideArr: (string | number | null)[];
118
+ orChecked: boolean;
119
+ checked: boolean;
120
+ childNum: number;
121
+ lastRank?: boolean;
122
+ children?: TreeListItem[];
123
+ }
124
+
125
+ // Props 接口
126
+ interface PickerTreeProps {
127
+ range: TreeNode[];
128
+ rangeNext: TreeNode[];
129
+ request?: ((params: { pageSize: number; pageNum: number; resourceC: string }) => Promise<{ rows: any[]; total?: number }>) | null;
130
+ idKey: string;
131
+ modelValue: string | string[];
132
+ nameKey: string;
133
+ allKey: string;
134
+ placeholder: string;
135
+ title: string;
136
+ multiple: boolean;
137
+ isSearch: boolean;
138
+ disabled: boolean;
139
+ cascade: boolean;
140
+ isShowLabel: boolean;
141
+ selectParent: boolean;
142
+ foldAll: boolean;
143
+ confirmColor: string;
144
+ cancelColor: string;
145
+ titleColor: string;
146
+ currentIcon: string;
147
+ defaultIcon: string;
148
+ lastIcon: string;
149
+ }
150
+
151
+ const props = withDefaults(defineProps<PickerTreeProps>(), {
152
+ range: () => [],
153
+ rangeNext: () => [],
154
+ request: null,
155
+ idKey: 'id',
156
+ modelValue: '',
157
+ nameKey: 'name',
158
+ allKey: 'value',
159
+ placeholder: '请选择',
160
+ title: '',
161
+ multiple: true,
162
+ isSearch: false,
163
+ disabled: false,
164
+ cascade: false,
165
+ isShowLabel: true,
166
+ selectParent: true,
167
+ foldAll: false,
168
+ confirmColor: '#007aff',
169
+ cancelColor: '#757575',
170
+ titleColor: '#757575',
171
+ currentIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAABRCAYAAACqj0o2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEQ0QTM0MzQ1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEQ0QTM0MzU1Q0RBMTFFOUE0MjY4NzI1Njc1RjI1ODIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowRDRBMzQzMjVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowRDRBMzQzMzVDREExMUU5QTQyNjg3MjU2NzVGMjU4MiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PidwepsAAAK0SURBVHja7JxbTsJAFIYHww7ciStgCeoGvGxAiOsgURegoL5720AXYLiIr0aJviq3Zx3PhIEnKG3ndtr+f3KixrSUj/ZjzjClIqUUiFm2gAAQAREQEUAEREAERAQQAREQAREBREAEREBEEqa67h9RFDWllDv0awWYlqlQHmu1WjMRRMoV1QFttA12y3xRtdNczq8EsE4/f8FumX2q77ROvNXk8UGMEKdUz6tYJHljaZAbuyUH+UR1to5BEohTuqwPCeS4pAA/qY6o/kyHOAMCeRK3owJnj+rH1jjxhqpVsstaebCz6TmnHWyXyY+xHjSBWBY/bvSgadtXBj9u9KCN3rnIfkzkQVsTEEX0Y2IP2oKo/HhMICcFAThUcwVZNGU6FdbX/XURzkbVF4+ybGhjPrFdgP66QdXNurGtSdk6Xdb9nAJ8oDo3OQlsQZzkdPw41ONBo6vI5scDefRjZg+6gpg3Pxp50CXEvPjR2IOuIXL3oxUPuobI3Y9WPOgDIlc/WvOgL4iL/vqFCcD7LH0xB4hj7cfQ/fWH9qCT+FhG0tN+DBk1PzjOM0SVllixcsBT1AvYc/kAPhc0hRg/3uvxoCgKRN9+dOrBUBB9+9GpB0NC9OVH5x4MDdG1H714kANEV3705kEOEBf9dcPi/lQnsuvLg1wgSu3Ha0v7Uh4MMgUXeuG71H407a+VBy9CPQkOdw+MtB+nGbd/D+FBbhBNxo9SjwcngJjNj0E9yBFiFj8G9SBXiGn8GNyDnCEm8SMLD3KHGOdHNh7kDjHOj2w8mAeIi/5arX+c6b/fxHz9oADEdGdjR/fXCw/OOB5oVfCOgnepz8IB14PMw03jCmTE+QBx5z0gAmKSqK9OUF+hcAeIhu/QYr4Qie8rjW83hhMBERARQAREQAREBBABERCLnH8BBgA+TQI7U4t53AAAAABJRU5ErkJggg==',
172
+ defaultIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFEAAABRCAYAAACqj0o2AAACE0lEQVR4Xu3c200DMRCF4XEltJAOkEugA+ggpUAHoQMqiFMCdEAJUMEiS4mEELlIO7bPOeN9i6K1rG/952myyea1WiCtXmEuYBPR4RBMxInoIOCwhOtJLKVszWyXc/5y2BvNEq6I+/3+kFK6M7OHnPM7jcLKjbZAvD/uaZtzflm5P4rbWyJWgDcze1LPuzVihfxUz7sH4ilJ2bx7Isrm3RtRMu8RiHJ5j0SUyXs0okTeCIj0eSMh0uaNhkiZNyIiXd7IiDR5oyNS5M2ACJ83EyJs3myIkHkzIsLlzYwIkzc7IkTeCojD81ZCHJa3GuKQvBURu+etjNgtb3XELnlHQGyedyTEZnlHQ2ySd0RE97wjI7rlHR3RJe+JeIrbLOecD6ePpZQ6W1kn2epo4MUrPOKyLN8ppYq1+y1VStncOjIdGnFZlo+U0uOtWOeOY2TE12Ouq//pEA7xXL7XfvcufR8K0Svfv6CREN3yDYfYIt9QiK3yjYTYLF95xB75SiP2ylcZsVu+cogj8pVCHJWvEuKwfOkREfKlRkTJlxkRJl86RMR8qRBR82VChM0XHpEhX2hElnyREWnyhUNkzBcKkTVfJETafIcjKuQ7FFEl35GIMvl2R1TMtyuiar49EWXzbY5oZpv/hibXTF2h3+s60FRKeT6+3TjMS3nrA3ZFRD8xrfY3ER1kJ+JEdBBwWGKeRAfEH1wS5WFZSDB/AAAAAElFTkSuQmCC',
173
+ lastIcon: ''
207
174
  });
208
175
 
209
- const emit = defineEmits(['cancel', 'confirm', 'update:modelValue']);
176
+ // Emits 接口
177
+ interface PickerTreeEmits {
178
+ (e: 'cancel'): void;
179
+ (e: 'confirm', data: TreeListItem[]): void;
180
+ (e: 'update:modelValue', value: string | string[]): void;
181
+ }
182
+
183
+ const emit = defineEmits<PickerTreeEmits>();
210
184
 
211
185
  defineExpose({
212
186
  _show,
213
187
  _hide
214
188
  });
215
- const paging = ref(null);
216
-
217
- const showTree = ref(false);
218
- const dataList = ref([]);
219
- const searchName = ref('');
220
- const treeList = ref([]);
221
- const returnedItem = ref([]);
222
- const childNums = ref([]);
223
- const curLabel = defineModel('label', { default: '', type: String });
224
-
225
- let val = [];
226
- let temporarySelectedValue = [];
227
- let label = [];
228
- let originalTreeList = []; // 保存原始数据
229
-
230
- const changeSelect = (val) => {
189
+
190
+ const paging = ref<any>(null);
191
+
192
+ const showTree = ref<boolean>(false);
193
+ const dataList = ref<any[]>([]);
194
+ const searchName = ref<string>('');
195
+ const treeList = ref<TreeListItem[]>([]);
196
+ const returnedItem = ref<TreeNode | null>(null);
197
+ const childNums = ref<Record<string | number, number>>({});
198
+ const curLabel = defineModel<string>('label', { default: '', type: String });
199
+
200
+ let val: (string | number)[] = [];
201
+ let temporarySelectedValue: (string | number)[] = [];
202
+ let label: string[] = [];
203
+ let originalTreeList: TreeListItem[] = []; // 保存原始数据
204
+
205
+ const changeSelect = (val: string): void => {
231
206
  // 如果没有输入搜索内容,则恢复原始列表
232
207
  if (props.request) {
233
208
  paging.value && paging.value.reload();
@@ -252,7 +227,7 @@ const changeSelect = (val) => {
252
227
  */
253
228
  watch(
254
229
  () => props.range,
255
- (newVal) => {
230
+ (newVal: TreeNode[]) => {
256
231
  if (!props.request) {
257
232
  _initTree(newVal);
258
233
  }
@@ -260,7 +235,7 @@ watch(
260
235
  );
261
236
  watch(
262
237
  () => dataList.value,
263
- (newVal) => {
238
+ (newVal: any[]) => {
264
239
  if (props.request) {
265
240
  const data = newVal.map((item) => {
266
241
  return {
@@ -300,7 +275,7 @@ watch(
300
275
  */
301
276
  watch(
302
277
  () => props.modelValue,
303
- (newVal) => {
278
+ (newVal: string | string[]) => {
304
279
  if (!newVal) {
305
280
  curLabel.value = '';
306
281
  }
@@ -324,7 +299,7 @@ onMounted(() => {
324
299
  }
325
300
  });
326
301
 
327
- function queryList(pageNum, pageSize) {
302
+ function queryList(pageNum: number, pageSize: number): void {
328
303
  if (!props.request) return;
329
304
  props
330
305
  .request({
@@ -343,7 +318,7 @@ function queryList(pageNum, pageSize) {
343
318
  /**
344
319
  * 显示树选择器
345
320
  */
346
- function _show() {
321
+ function _show(): void {
347
322
  if (props.disabled) return;
348
323
  showTree.value = true;
349
324
  if (props.request) {
@@ -356,7 +331,7 @@ function _show() {
356
331
  /**
357
332
  * 隐藏树选择器
358
333
  */
359
- function _hide() {
334
+ function _hide(): void {
360
335
  // temporarySelectedValue = [];
361
336
  showTree.value = false;
362
337
  emit('cancel');
@@ -365,7 +340,7 @@ function _hide() {
365
340
  /**
366
341
  * 取消选择操作
367
342
  */
368
- function _cancel() {
343
+ function _cancel(): void {
369
344
  // if (!props.multiple) {
370
345
  // curLabel.value = '';
371
346
  // emit('update:modelValue', '');
@@ -382,9 +357,9 @@ function _cancel() {
382
357
  /**
383
358
  * 确认选择操作,处理选中数据并触发事件
384
359
  */
385
- function _confirm() {
360
+ function _confirm(): void {
386
361
  // 处理所选数据
387
- let rt = [];
362
+ let rt: TreeListItem[] = [];
388
363
  treeList.value.forEach((v, i) => {
389
364
  if (treeList.value[i].checked) {
390
365
  rt.push({
@@ -420,12 +395,12 @@ function _confirm() {
420
395
 
421
396
  /**
422
397
  * 扁平化树结构,将嵌套数据转换为列表形式
423
- * @param {Array} list - 树形数据列表
424
- * @param {Number} rank - 当前节点层级
425
- * @param {Array} parentId - 父节点ID数组
426
- * @param {Array} parents - 父节点对象数组
398
+ * @param list - 树形数据列表
399
+ * @param rank - 当前节点层级
400
+ * @param parentId - 父节点ID数组
401
+ * @param parents - 父节点对象数组
427
402
  */
428
- function _renderTreeList(list = [], rank = 0, parentId = [], parents = []) {
403
+ function _renderTreeList(list: TreeNode[] = [], rank: number = 0, parentId: (string | number)[] = [], parents: any[] = []): void {
429
404
  val = [];
430
405
  temporarySelectedValue = [];
431
406
  if (Array.isArray(props.modelValue)) {
@@ -461,9 +436,8 @@ function _renderTreeList(list = [], rank = 0, parentId = [], parents = []) {
461
436
  });
462
437
 
463
438
  if (Array.isArray(item.children) && item.children.length > 0) {
464
- let parentid = [...parentId],
465
- parentArr = [...parents];
466
- delete parentArr.children;
439
+ const parentid = [...parentId];
440
+ const parentArr: any[] = [...parents];
467
441
  parentid.push(item[props.idKey]);
468
442
  parentArr.push({
469
443
  [props.idKey]: item[props.idKey],
@@ -481,7 +455,7 @@ function _renderTreeList(list = [], rank = 0, parentId = [], parents = []) {
481
455
  /**
482
456
  * 处理默认选中项,展开已选中节点的父级
483
457
  */
484
- function _defaultSelect() {
458
+ function _defaultSelect(range?: TreeNode[]): void {
485
459
  treeList.value.forEach((v) => {
486
460
  if (v.checked) {
487
461
  treeList.value.forEach((v2) => {
@@ -499,11 +473,11 @@ function _defaultSelect() {
499
473
 
500
474
  /**
501
475
  * 根据ID查找节点
502
- * @param {String|Number} id - 节点ID
503
- * @param {Array} arr - 查找范围数组
504
- * @returns {Object} 查找到的节点对象
476
+ * @param id - 节点ID
477
+ * @param arr - 查找范围数组
478
+ * @returns 查找到的节点对象
505
479
  */
506
- function getOwn(id, arr) {
480
+ function getOwn(id: string | number, arr: TreeNode[]): TreeNode | undefined {
507
481
  if (arr && arr.length) {
508
482
  //利用foreach循环遍历
509
483
  arr.forEach((item) => {
@@ -511,23 +485,24 @@ function getOwn(id, arr) {
511
485
  if (item[props.idKey] === id) {
512
486
  // 存储数据到空数组
513
487
  returnedItem.value = item;
514
- } else if (item.children !== null) {
488
+ } else if (item.children !== null && item.children !== undefined) {
515
489
  //判断chlidren是否有数据
516
490
  //递归调用
517
491
  getOwn(id, item.children);
518
492
  }
519
493
  });
520
- return returnedItem.value;
494
+ return returnedItem.value || undefined;
521
495
  }
496
+ return undefined;
522
497
  }
523
498
 
524
499
  /**
525
500
  * 设置节点显示状态
526
- * @param {String|Number} id - 节点ID
527
- * @param {Array} arr - 节点数组
528
- * @param {Boolean} isShow - 是否显示
501
+ * @param id - 节点ID
502
+ * @param arr - 节点数组
503
+ * @param isShow - 是否显示
529
504
  */
530
- function setShow(id, arr, isShow) {
505
+ function setShow(id: string | number, arr: any[], isShow: boolean): void {
531
506
  arr.forEach((item, index) => {
532
507
  if (item.parentId.includes(id)) {
533
508
  treeList.value[index].showChild = isShow;
@@ -539,10 +514,10 @@ function setShow(id, arr, isShow) {
539
514
  }
540
515
  /**
541
516
  * 点击树节点处理函数
542
- * @param {Object} item - 被点击的节点对象
543
- * @param {Number} index - 节点在列表中的索引
517
+ * @param item - 被点击的节点对象
518
+ * @param index - 节点在列表中的索引
544
519
  */
545
- function _treeItemTap(item, index) {
520
+ function _treeItemTap(item: TreeListItem, index: number): void {
546
521
  if (item.lastRank === true) {
547
522
  //点击最后一级时触发事件
548
523
  treeList.value[index].checked = !treeList.value[index].checked;
@@ -556,7 +531,7 @@ function _treeItemTap(item, index) {
556
531
  const range = props.range;
557
532
  // 找到当前元素
558
533
  const own = getOwn(id, range);
559
- const checkedChildren = own.children;
534
+ const checkedChildren = own?.children;
560
535
  // 子元素插入的索引位置
561
536
  const nextIndex = treeList.value.findIndex((itemT) => itemT.id === item.id);
562
537
  if (checkedChildren === undefined || checkedChildren.length < 1) {
@@ -566,7 +541,7 @@ function _treeItemTap(item, index) {
566
541
  treeList.value[index].childNum = checkedChildren.length;
567
542
  const newRank = item.rank + 1;
568
543
  checkedChildren.forEach((itemC) => {
569
- const childObj = {
544
+ const childObj: TreeListItem = {
570
545
  id: itemC[props.idKey],
571
546
  name: itemC[props.nameKey],
572
547
  value: itemC[props.allKey],
@@ -576,11 +551,12 @@ function _treeItemTap(item, index) {
576
551
  rank: newRank, // 层级
577
552
  showChild: false, //子级是否显示
578
553
  open: false, //是否打开
579
- show: 1, // 自身是否显示
554
+ show: true, // 自身是否显示
580
555
  hideArr: [],
581
556
  lastRank: itemC.children && itemC.children.length > 0 ? false : true,
582
557
  orChecked: treeList.value[index].checked,
583
- checked: props.cascade ? treeList.value[index].checked : false
558
+ checked: props.cascade ? treeList.value[index].checked : false,
559
+ childNum: 0
584
560
  };
585
561
  if (!treeList.value.some((itemT) => itemT.id === itemC[props.idKey])) {
586
562
  treeList.value.splice(nextIndex + 1, 0, childObj);
@@ -613,13 +589,13 @@ function _treeItemTap(item, index) {
613
589
  setShow(childItem.id, treeList.value, false);
614
590
  }
615
591
  }
616
- if (childItem.children !== undefined) {
617
- childItem.children.forEach((childItem1, i1) => {
592
+ if (childItem.children !== undefined && Array.isArray(childItem.children)) {
593
+ childItem.children.forEach((childItem1: TreeListItem, i1: number) => {
618
594
  if (!childItem1.parentId.includes(childItem.id)) {
619
595
  return;
620
596
  }
621
- childItem.children[i1].showChild = false;
622
- childItem.children[i1].show = false;
597
+ childItem.children![i1].showChild = false;
598
+ childItem.children![i1].show = false;
623
599
  });
624
600
  }
625
601
  childItem.show = false;
@@ -645,26 +621,26 @@ function _treeItemTap(item, index) {
645
621
  }
646
622
  /**
647
623
  * 同步选中状态到子节点
648
- * @param {Array} trees - 树节点数组
649
- * @param {String|Number} pid - 父节点ID
650
- * @param {Boolean} checked - 选中状态
624
+ * @param trees - 树节点数组
625
+ * @param pid - 父节点ID
626
+ * @param checked - 选中状态
651
627
  */
652
- function syncChecked(trees, pid, checked) {
628
+ function syncChecked(trees: TreeListItem[], pid: string | number, checked: boolean): void {
653
629
  trees.forEach((item, index) => {
654
630
  if (item.parentId.includes(pid)) {
655
631
  treeList.value[index].checked = checked;
656
632
  syncChecked(trees, item.id, checked);
657
- } else if (item.children !== undefined) {
633
+ } else if (item.children !== undefined && Array.isArray(item.children)) {
658
634
  syncChecked(item.children, pid, checked);
659
635
  }
660
636
  });
661
637
  }
662
638
  /**
663
639
  * 设置祖先节点选中状态
664
- * @param {Array} pids - 父节点ID数组
665
- * @param {Boolean} checked - 选中状态
640
+ * @param pids - 父节点ID数组
641
+ * @param checked - 选中状态
666
642
  */
667
- function setAncestors(pids, checked) {
643
+ function setAncestors(pids: (string | number)[], checked: boolean): void {
668
644
  treeList.value.forEach((item, index) => {
669
645
  if (pids.includes(item.id)) {
670
646
  if (checked && childNums.value[item.id] !== undefined && item.childNum === childNums.value[item.id]) {
@@ -680,10 +656,10 @@ function setAncestors(pids, checked) {
680
656
 
681
657
  /**
682
658
  * 树节点选择处理函数
683
- * @param {Object} item - 被选择的节点对象
684
- * @param {Number} index - 节点在列表中的索引
659
+ * @param item - 被选择的节点对象
660
+ * @param index - 节点在列表中的索引
685
661
  */
686
- function _treeItemSelect(item, index) {
662
+ function _treeItemSelect(item: TreeListItem, index: number): void {
687
663
  treeList.value[index].checked = !treeList.value[index].checked;
688
664
 
689
665
  if (treeList.value[index].checked) {
@@ -718,9 +694,9 @@ function _treeItemSelect(item, index) {
718
694
  }
719
695
  /**
720
696
  * 处理单选/多选逻辑
721
- * @param {Number} index - 当前选中项的索引
697
+ * @param index - 当前选中项的索引
722
698
  */
723
- function _fixMultiple(index) {
699
+ function _fixMultiple(index: number): void {
724
700
  if (!props.multiple) {
725
701
  // 如果是单选
726
702
  treeList.value.forEach((v, i) => {
@@ -735,7 +711,7 @@ function _fixMultiple(index) {
735
711
  /**
736
712
  * 重置树列表数据
737
713
  */
738
- function _reTreeList() {
714
+ function _reTreeList(): void {
739
715
  if (!props.range.length) {
740
716
  return;
741
717
  }
@@ -746,9 +722,9 @@ function _reTreeList() {
746
722
 
747
723
  /**
748
724
  * 初始化树结构
749
- * @param {Array} range - 树数据范围
725
+ * @param range - 树数据范围
750
726
  */
751
- function _initTree(range = props.range) {
727
+ function _initTree(range: TreeNode[] = props.range): void {
752
728
  treeList.value = [];
753
729
  val = [];
754
730
  label = [];
@@ -1,12 +1,10 @@
1
- // index.ts
2
- import type { App } from 'vue';
3
- import HwPickerTree from './HwPickerTree.vue';
4
- import type { HwPickerTreeProps, HwPickerTreeEmits, HwPickerTreeInstance } from './HwPickerTree.d.ts';
5
-
6
- // 使用install方法,在app.use挂载
7
- HwPickerTree.install = (app: App) => {
8
- app.component(HwPickerTree.__name as string, HwPickerTree); //注册组件
9
- };
10
-
11
- export default HwPickerTree;
12
- export type { HwPickerTreeProps, HwPickerTreeEmits, HwPickerTreeInstance };
1
+ // index.ts
2
+ import type { App } from 'vue';
3
+ import HwPickerTree from './HwPickerTree.vue';
4
+
5
+ // 使用install方法,在app.use挂载
6
+ HwPickerTree.install = (app: App) => {
7
+ app.component(HwPickerTree.__name as string, HwPickerTree); //注册组件
8
+ };
9
+
10
+ export default HwPickerTree;
package/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { App } from 'vue';
2
2
  import HwBtn from './HwBtn';
3
3
  import HwDraggableBottomPopup from './HwDraggableBottomPopup';
4
4
  import HwSelect from './HwSelect';
5
- import HwPickerTree, { HwPickerTreeProps, HwPickerTreeEmits, HwPickerTreeInstance } from './HwPickerTree';
5
+ import HwPickerTree from './HwPickerTree';
6
6
  import HwInput from './HwInput';
7
7
  import HwFileUpload from './HwFileUpload';
8
8
  import HwCheckbox from './HwCheckbox';
@@ -24,9 +24,6 @@ export {
24
24
  HwModal
25
25
  };
26
26
 
27
- // 导出组件类型
28
- export type { HwPickerTreeProps, HwPickerTreeEmits, HwPickerTreeInstance };
29
-
30
27
  // 导出类型定义
31
28
  export type { ZPagingInstance } from './types';
32
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hw-cus-ui",
3
- "version": "1.1.21",
3
+ "version": "1.1.23",
4
4
  "description": "使用该组件库需安装uniapp插件@dcloudio/uni-ui",
5
5
  "main": "index.ts",
6
6
  "scripts": {
@@ -15,7 +15,7 @@
15
15
  "@vueuse/core": "^10.0.0"
16
16
  },
17
17
  "peerDependencies": {
18
- "vue": "^3.0.0",
18
+ "vue": "^3.5.24",
19
19
  "sass": "^1.0.0"
20
20
  }
21
21
  }
@@ -1,84 +0,0 @@
1
- import { DefineComponent } from 'vue';
2
-
3
- // HwPickerTree 组件的 Props 接口定义
4
- export interface HwPickerTreeProps {
5
- /** 树形数据范围 */
6
- range?: any[];
7
- /** 下一级数据范围(用于分页加载) */
8
- rangeNext?: any[];
9
- /** 请求函数,用于分页加载数据 */
10
- request?: Function | null;
11
- /** ID 字段键名,默认 'id' */
12
- idKey?: string;
13
- /** 绑定值,字符串或字符串数组 */
14
- modelValue?: string | string[];
15
- /** 名称字段键名,默认 'name' */
16
- nameKey?: string;
17
- /** 值字段键名,默认 'value' */
18
- allKey?: string;
19
- /** 占位符文本,默认 '请选择' */
20
- placeholder?: string;
21
- /** 弹窗标题 */
22
- title?: string;
23
- /** 是否支持多选,默认 true */
24
- multiple?: boolean;
25
- /** 是否显示搜索框,默认 false */
26
- isSearch?: boolean;
27
- /** 是否禁用,默认 false */
28
- disabled?: boolean;
29
- /** 是否级联选择,默认 false */
30
- cascade?: boolean;
31
- /** 是否显示标签,默认 true */
32
- isShowLabel?: boolean;
33
- /** 是否可以选择父级,默认 true */
34
- selectParent?: boolean;
35
- /** 折叠时是否关闭所有已打开的子集,默认 false */
36
- foldAll?: boolean;
37
- /** 确定按钮颜色,默认 '#007aff' */
38
- confirmColor?: string;
39
- /** 取消按钮颜色,默认 '#757575' */
40
- cancelColor?: string;
41
- /** 标题颜色,默认 '#757575' */
42
- titleColor?: string;
43
- /** 展开时的图标(base64 或 URL) */
44
- currentIcon?: string;
45
- /** 折叠时的图标(base64 或 URL) */
46
- defaultIcon?: string;
47
- /** 末级图标(base64 或 URL) */
48
- lastIcon?: string;
49
- }
50
-
51
- // HwPickerTree 组件事件定义
52
- export interface HwPickerTreeEmits {
53
- (e: 'cancel'): void;
54
- (e: 'confirm', value: any[]): void;
55
- (e: 'update:modelValue', value: string | string[]): void;
56
- }
57
-
58
- // HwPickerTree 组件实例方法
59
- export interface HwPickerTreeInstance {
60
- /** 显示树选择器 */
61
- _show: () => void;
62
- /** 隐藏树选择器 */
63
- _hide: () => void;
64
- }
65
-
66
- // HwPickerTree 组件类型声明
67
- declare const HwPickerTree: DefineComponent<
68
- HwPickerTreeProps,
69
- {},
70
- {},
71
- {},
72
- {},
73
- {},
74
- {},
75
- {
76
- cancel: () => void;
77
- confirm: (value: any[]) => void;
78
- 'update:modelValue': (value: string | string[]) => void;
79
- }
80
- > & {
81
- install: (app: any) => void;
82
- };
83
-
84
- export default HwPickerTree;