@netang/quasar 0.0.37 → 0.0.40

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.
@@ -79,16 +79,17 @@
79
79
  no-refocus
80
80
  no-focus
81
81
  fit
82
- @focus="onPopupFocus"
82
+ @focus="onFieldBlur"
83
83
  @show="onPopupShow"
84
- @before-hide="onPopupBeforeHide"
84
+ @before-hide="showPopup = false"
85
85
  v-if="! readonly"
86
86
  >
87
87
  <!-- 快捷表格 -->
88
88
  <q-table
89
89
  class="n-table n-field-table__popup-table"
90
90
  v-model:pagination="tablePagination"
91
- v-model:selected="selected"
91
+ :selected="selected"
92
+ @update:selected="emitModelValue"
92
93
  :row-key="tableRowKey"
93
94
  :rows="tableRows"
94
95
  :columns="columns"
@@ -147,7 +148,7 @@
147
148
  width="80%"
148
149
  :on-confirm="onDialogConfirm"
149
150
  @before-show="onDialogBeforeShow"
150
- @show="onDialogShow"
151
+ @show="tableLoad"
151
152
  @hide="onDialogHide"
152
153
  cancel
153
154
  v-bind="dialogProps"
@@ -159,7 +160,7 @@
159
160
  </template>
160
161
 
161
162
  <script>
162
- import { ref, computed, watch, onMounted, onUpdated } from 'vue'
163
+ import { ref, computed, watch, onUpdated } from 'vue'
163
164
 
164
165
  export default {
165
166
 
@@ -172,18 +173,11 @@ export default {
172
173
  * 声明属性
173
174
  */
174
175
  props: {
175
- // 值
176
- modelValue: [ String, Number, Array ],
177
- // 表格请求路径
178
- path: String,
179
- // 表格请求参数
180
- query: Object,
181
- // 附加请求数据
182
- data: Object,
183
- // 已选数据
184
- selected: Array,
185
- // 初始时不加载选择数据
186
- noLoadSelected: Boolean,
176
+ // 值 v-model
177
+ modelValue: {
178
+ type: [ String, Number, Array ],
179
+ required: true,
180
+ },
187
181
  // 值字段(必填)
188
182
  valueKey: {
189
183
  type: String,
@@ -191,6 +185,28 @@ export default {
191
185
  },
192
186
  // 标签字段
193
187
  labelKey: String,
188
+ // 值类型
189
+ // string: 分隔符隔开的字符串
190
+ // array: 数组
191
+ // arrayObject: 数组对象
192
+ valueType: {
193
+ type: String,
194
+ default: 'arrayObject'
195
+ },
196
+ // 值分隔符(值类型为 string 有效)
197
+ valueSeparator: {
198
+ type: String,
199
+ default: ',',
200
+ },
201
+
202
+ // 表格请求路径
203
+ path: String,
204
+ // 表格请求参数
205
+ query: Object,
206
+ // 附加请求数据
207
+ data: Object,
208
+ // 不加载已选数据
209
+ noLoadSelected: Boolean,
194
210
  // 格式化显示标签
195
211
  formatLabel: Function,
196
212
  // 快捷表格显示的字段数组(空为:[值字段, 标签字段])
@@ -206,8 +222,6 @@ export default {
206
222
  // 对话框声明属性
207
223
  dialogProps: Object,
208
224
 
209
- // 值是否为数组
210
- valueArray: Boolean,
211
225
  // 关闭对话框
212
226
  noDialog: Boolean,
213
227
 
@@ -232,11 +246,6 @@ export default {
232
246
  type: [ Number, String ],
233
247
  default: 500
234
248
  },
235
- // 值分隔符(值为非数组有效)
236
- valueSeparator: {
237
- type: String,
238
- default: ',',
239
- },
240
249
  },
241
250
 
242
251
  /**
@@ -298,6 +307,7 @@ export default {
298
307
 
299
308
  // ==========【数据】============================================================================================
300
309
 
310
+
301
311
  // 创建权限实例
302
312
  const $power = utils.$power.create({
303
313
  // 路由路径
@@ -328,7 +338,7 @@ export default {
328
338
  // 选择类型, 可选值 single multiple none
329
339
  selection: props.multiple ? 'multiple' : 'single',
330
340
  // 已选数据
331
- selected: initSelected(),
341
+ selected: [],
332
342
  // http 设置
333
343
  httpSettings: {
334
344
  // 头部请求
@@ -344,12 +354,6 @@ export default {
344
354
  // 创建防抖睡眠方法
345
355
  const sleep = utils.debounceSleep()
346
356
 
347
- // 停止观察值
348
- let stopValueWatcher = false
349
-
350
- // 停止观察已选数据
351
- let stopSelectedWatcher = false
352
-
353
357
  // 输入框节点
354
358
  const inputRef = ref(null)
355
359
 
@@ -365,24 +369,28 @@ export default {
365
369
  // 是否显示弹出层
366
370
  const showPopup = ref(false)
367
371
 
368
- // 当前已选数据
369
- const selected = ref([...$table.tableSelected.value])
370
-
371
372
  // 当前表格列数据
372
373
  const columns = getQuickTableColumns()
373
374
 
374
- // 如果有已选数据
375
- if (utils.isValidArray(selected.value)) {
376
- // 检查值更新
377
- checkModelValueChange()
378
- }
375
+ // 停止观察值
376
+ let stopValueWatcher = false
377
+
378
+ // 临时已选数据
379
+ let tempSelected = []
380
+
381
+ // 初始化已选数据
382
+ const selected = ref(valueToSelected(props.modelValue, true, true))
383
+
384
+ // 加载已选数据
385
+ loadSelected()
386
+ .finally()
379
387
 
380
388
  // ==========【监听数据】=========================================================================================
381
389
 
382
390
  /**
383
391
  * 监听声明值
384
392
  */
385
- watch(()=>props.modelValue, async function() {
393
+ watch(() => props.modelValue, async function(val) {
386
394
 
387
395
  // 如果停止观察值
388
396
  if (stopValueWatcher === true) {
@@ -391,102 +399,75 @@ export default {
391
399
  return
392
400
  }
393
401
 
394
- // 格式化值
395
- let values = formatModelValue()
402
+ // 值转已选数据
403
+ let newSelected = valueToSelected(val, false, false)
396
404
 
397
- // 如果值是有效数组
398
- if (utils.isValidArray(values)) {
405
+ // 如果值类型是数组对象
406
+ if (props.valueType === 'arrayObject') {
399
407
 
400
- // 去重
401
- values = _.uniq(values)
408
+ // 设置已选数据
409
+ setSelected(newSelected)
402
410
 
403
- // 已选数据值数组
404
- const selectedValues = utils.isValidArray(selected.value)
405
- // 如果有已选数据
406
- ? _.uniq(selected.value.map(e => e[props.valueKey]))
407
- // 否则为空
408
- : []
409
-
410
- // 需增删除的值
411
- const removeValues = selectedValues.filter(e => values.indexOf(e) === -1)
412
- if (removeValues.length) {
413
- utils.forEachRight(selected.value, function (item, index) {
414
- if (removeValues.indexOf(item[props.valueKey]) > -1) {
415
- selected.value.splice(index, 1)
416
- }
417
- })
418
- }
419
-
420
- // 需增加的值
421
- const addValues = values.filter(e => selectedValues.indexOf(e) === -1)
422
- if (addValues.length) {
423
- // 请求选择数据
424
- selected.value.push(...await onRequestSelected(addValues))
425
- }
426
-
427
- // 否则
411
+ // 否则值类型是字符串或数组
428
412
  } else {
429
- // 清空已选数据
430
- selected.value = []
431
- }
432
413
 
433
- // 检查值更新
434
- checkModelValueChange()
435
- })
414
+ // 初始已选数据
415
+ let _selected = []
436
416
 
437
- /**
438
- * 监听声明选择数据
439
- */
440
- watch(()=>props.selected, function(val) {
417
+ // 如果值转已选数据是有效数组
418
+ if (newSelected.length) {
441
419
 
442
- // 如果停止观察已选数据
443
- if (stopSelectedWatcher === true) {
444
- // 取消停止观察已选数据
445
- stopSelectedWatcher = false
446
- return
447
- }
420
+ // 当前已选数据
421
+ const currentSelected = tempSelected.length ? tempSelected : selected.value
448
422
 
449
- if (val !== selected.value) {
450
- // 设置选择数据
451
- selected.value = val
452
- }
423
+ // 如果有已选数据
424
+ if (currentSelected.length) {
453
425
 
454
- // 检查值更新
455
- checkModelValueChange()
426
+ // 新已选数据
427
+ _selected = currentSelected.filter(e => newSelected.indexOf(e[props.valueKey]) > -1)
456
428
 
457
- // 设置输入框焦点
458
- setInputFocus()
429
+ // 需增加的值
430
+ newSelected = newSelected.filter(e => _selected.map(e => e[props.valueKey]).indexOf(e) === -1)
431
+ }
459
432
 
460
- // 设置输入框文字选中
461
- setInputSelection()
433
+ // 需增加的值
434
+ if (newSelected.length) {
462
435
 
463
- }, {
464
- // 深度监听
465
- deep: true
466
- })
436
+ // 如果不加载已选数据
437
+ if (props.noLoadSelected) {
438
+ // 请求选择数据
439
+ _selected.push(...newSelected.map(e => setSelectedItem(e)))
440
+ } else {
441
+ // 请求选择数据
442
+ _selected.push(...await onRequestSelected(newSelected))
443
+ }
444
+ }
445
+ }
467
446
 
468
- /**
469
- * 监听当前已选数据
470
- */
471
- watch(selected, function(val) {
447
+ // 设置已选数据
448
+ setSelected(_selected)
472
449
 
473
- if (val !== props.selected) {
450
+ // 清空临时已选数据
451
+ tempSelected = []
452
+ }
474
453
 
475
- // 停止观察已选数据
476
- stopSelectedWatcher = true
454
+ // 将已选数据转为值
455
+ const _value = selectedToValue(selected.value)
477
456
 
478
- // 更新选择数据
479
- emit('update:selected', val)
457
+ // 如果声明值发生变化
458
+ if (_value !== props.modelValue) {
459
+ // 停止观察值
460
+ stopValueWatcher = true
461
+ // 触发更新已选数据
462
+ emit('update:modelValue', _value)
480
463
  }
481
464
 
482
- // 检查值更新
483
- checkModelValueChange()
484
-
485
465
  // 设置输入框焦点
486
466
  setInputFocus()
487
467
 
488
468
  // 设置输入框文字选中
489
469
  setInputSelection()
470
+
490
471
  }, {
491
472
  // 深度监听
492
473
  deep: true,
@@ -497,32 +478,26 @@ export default {
497
478
  */
498
479
  watch(inputValue, async function (val) {
499
480
 
500
- // 取消延迟执行
501
- sleep.cancel()
481
+ // 延迟执行
482
+ await sleep(props.inputDebounce)
502
483
 
484
+ // 是否有值
503
485
  const hasValue = utils.isValidValue(val)
504
- if (hasValue) {
505
486
 
506
- const n_search = {}
507
- n_search[currentFilterKey.value] = [
508
- {
509
- // 比较类型
510
- compare: dicts.SEARCH_COMPARE_TYPE__LIKE,
511
- // 值
512
- value: val || '',
513
- }
514
- ]
515
-
516
- $table.tableQuery.value = {
517
- n_search,
487
+ const n_search = {}
488
+ n_search[currentFilterKey.value] = [
489
+ {
490
+ // 比较类型
491
+ compare: dicts.SEARCH_COMPARE_TYPE__LIKE,
492
+ // 值
493
+ value: hasValue ? val : '',
518
494
  }
495
+ ]
519
496
 
520
- } else {
521
- $table.tableQuery.value = {}
522
- }
523
-
524
- // 延迟执行
525
- await sleep(props.inputDebounce)
497
+ // 设置表格传参
498
+ $table.setQuery({
499
+ n_search,
500
+ })
526
501
 
527
502
  if (
528
503
  // 如果弹出层是隐藏的
@@ -541,33 +516,67 @@ export default {
541
516
  // ==========【方法】=============================================================================================
542
517
 
543
518
  /**
544
- * 初始化已选数据
519
+ * 加载已选数据
545
520
  */
546
- function initSelected() {
547
-
548
- // 如果有已选数据
549
- if (utils.isValidArray(props.selected)) {
521
+ async function loadSelected() {
550
522
 
551
- // 则返回已选数据
552
- return props.selected
553
- }
554
-
555
- // 如果初始时不加载选择数据
556
- if (props.noLoadSelected) {
557
-
558
- // 将值格式化为已选数据数组
559
- const vals = formatModelValue()
560
- if (utils.isValidArray(vals)) {
561
- return vals.map(function (val) {
562
- const obj = {}
563
- obj[props.valueKey] = val
564
- obj[currentlabelKey.value] = val
565
- return obj
566
- })
523
+ if (
524
+ // 如果值类型不是数组对象
525
+ props.valueType !== 'arrayObject'
526
+ // 如果不加载已选数据
527
+ && ! props.noLoadSelected
528
+ // 如果有请求路由路径
529
+ && routePath
530
+ ) {
531
+ // 获取值数组
532
+ const values = valueToSelected(props.modelValue, false, false)
533
+ if (values.length) {
534
+
535
+ // 初始的已选数据
536
+ const _selected = await onRequestSelected(values)
537
+ const _value = selectedToValue(_selected)
538
+
539
+ // 如果声明值未发生变化
540
+ if (_value === props.modelValue) {
541
+ // 设置已选数据
542
+ setSelected(_selected)
543
+
544
+ } else {
545
+ // 设置临时已选数据
546
+ tempSelected = _selected
547
+ // 触发更新值
548
+ emit('update:modelValue', _value)
549
+ }
550
+ return
567
551
  }
568
552
  }
569
553
 
570
- return []
554
+ // 触发更新已选数据
555
+ emit('update:selected', selected.value)
556
+ }
557
+
558
+ /**
559
+ * 触发更新值
560
+ */
561
+ function emitModelValue(val) {
562
+
563
+ // 设置临时已选数据
564
+ tempSelected = val
565
+
566
+ // 触发更新值
567
+ emit('update:modelValue', selectedToValue(val))
568
+ }
569
+
570
+ /**
571
+ * 设置已选数据
572
+ */
573
+ function setSelected(val) {
574
+
575
+ // 设置已选数据
576
+ selected.value = val
577
+
578
+ // 触发更新已选数据
579
+ emit('update:selected', val)
571
580
  }
572
581
 
573
582
  /**
@@ -583,18 +592,96 @@ export default {
583
592
  }
584
593
 
585
594
  /**
586
- * 格式化值
595
+ * 设置已选数据的单个元素
596
+ */
597
+ function setSelectedItem(val) {
598
+ const obj = {}
599
+ obj[props.valueKey] = val
600
+ obj[currentlabelKey.value] = val
601
+ return obj
602
+ }
603
+
604
+ /**
605
+ * 值转已选数据
587
606
  */
588
- function formatModelValue() {
607
+ function valueToSelected(val, isFirst, toSelected) {
608
+
609
+ // 如果值类型是数组对象
610
+ if (props.valueType === 'arrayObject') {
589
611
 
590
- // 如果值是数组
591
- if (props.valueArray) {
592
- return props.modelValue
612
+ // 如果是有效数组
613
+ if (utils.isValidArray(val)) {
614
+ for (const item of val) {
615
+ if (
616
+ // 如果元素不是有效对象
617
+ ! utils.isValidObject(item)
618
+ // 如果元素没有值字段
619
+ || ! _.has(item, props.valueKey)
620
+ ) {
621
+ return []
622
+ }
623
+ }
624
+ }
625
+
626
+ // 否则直接返回
627
+ return val
628
+ }
629
+
630
+ if (
631
+ // 非初始化
632
+ ! isFirst
633
+ // 或非加载已选数据
634
+ || props.noLoadSelected
635
+ // 或没有路由路径
636
+ || ! routePath
637
+ ) {
638
+ // 将值转为数组
639
+ val = props.valueType === 'string' ? utils.split(val, props.valueSeparator) : val
640
+
641
+ // 如果是有效数组
642
+ if (utils.isValidArray(val)) {
643
+ val = val.filter(e => utils.isValidValue(e))
644
+ return toSelected ? val.map(e => setSelectedItem(e)) : val
645
+ }
646
+ }
647
+
648
+ return []
649
+ }
650
+
651
+ /**
652
+ * 已选数据转值
653
+ */
654
+ function selectedToValue(val) {
655
+
656
+ // 如果值类型是数组对象
657
+ if (props.valueType === 'arrayObject') {
658
+
659
+ // 则直接返回
660
+ return val
661
+ }
662
+
663
+ // 值数组
664
+ const values = val.length
665
+ // 如果有已选数据
666
+ ? (
667
+ props.multiple
668
+ // 如果是多选
669
+ ? val.map(e => e[props.valueKey])
670
+ // 否则是单选
671
+ : [ val[0][props.valueKey] ]
672
+ )
673
+ // 否则为空
674
+ : []
675
+
676
+ // 如果值类型是数组
677
+ if (props.valueType === 'array') {
678
+
679
+ // 直接返回数组
680
+ return values
593
681
  }
594
682
 
595
- // 否则值是字符串/数字
596
- return _.uniq(utils.split(props.modelValue, props.valueSeparator))
597
- .filter(e => utils.isValidValue(e))
683
+ // 返回转为分隔符隔开的字符串
684
+ return utils.numberDeep(utils.join(values, props.valueSeparator))
598
685
  }
599
686
 
600
687
  /**
@@ -635,69 +722,6 @@ export default {
635
722
  return status && utils.isValidArray(_.get(data, 'rows')) ? data.rows : []
636
723
  }
637
724
 
638
- /**
639
- * 初始加载选择数据
640
- */
641
- async function onLoadSelected() {
642
-
643
- if (
644
- // 如果初始不加载选择数据
645
- props.noLoadSelected
646
- // 如果没有请求路由路径
647
- || ! routePath
648
- // 如果有选择数据
649
- || utils.isValidArray(selected.value)
650
- ) {
651
- // 则无任何操作
652
- return
653
- }
654
-
655
- // 格式化值
656
- const value = formatModelValue()
657
-
658
- // 如果值不是有效数组
659
- if (! utils.isValidArray(value)) {
660
- // 则无任何操作
661
- return
662
- }
663
-
664
- // 设置已选数据
665
- selected.value = await onRequestSelected(value)
666
- }
667
-
668
- /**
669
- * 检查值更新
670
- */
671
- function checkModelValueChange() {
672
-
673
- let newModelValue = utils.isValidArray(selected.value)
674
- // 如果有已选数据
675
- ? (
676
- props.multiple
677
- // 如果是多选
678
- ? selected.value.map(e => e[props.valueKey])
679
- // 否则是单选
680
- : [ selected.value[0][props.valueKey] ]
681
- )
682
- // 否则为空
683
- : []
684
-
685
- // 如果值为字符串或数字
686
- if (! props.valueArray) {
687
- newModelValue = utils.numberDeep(utils.join(newModelValue, props.valueSeparator))
688
- }
689
-
690
- // 如果值发生改变
691
- if (newModelValue !== props.modelValue) {
692
-
693
- // 停止观察值
694
- stopValueWatcher = true
695
-
696
- // 提交更新值
697
- emit('update:modelValue', newModelValue)
698
- }
699
- }
700
-
701
725
  /**
702
726
  * 获取表格列数据
703
727
  */
@@ -814,27 +838,14 @@ export default {
814
838
  */
815
839
  function onFieldClear() {
816
840
 
841
+ // 触发更新值
817
842
  // 清空快捷表格已选数据
818
- selected.value = []
843
+ emitModelValue([])
819
844
 
820
845
  // 隐藏弹出层
821
846
  popupRef.value.hide()
822
847
  }
823
848
 
824
- /**
825
- * 弹出层获取焦点触发
826
- */
827
- function onPopupFocus(e) {
828
-
829
- // 停止冒泡
830
- e.stopPropagation()
831
-
832
- // 设置输入框焦点
833
- setInputFocus()
834
-
835
- window.scrollTo(window.pageXOffset || window.scrollX || document.body.scrollLeft || 0, 0)
836
- }
837
-
838
849
  /**
839
850
  * 弹出层显示回调
840
851
  */
@@ -851,15 +862,6 @@ export default {
851
862
  .finally()
852
863
  }
853
864
 
854
- /**
855
- * 弹出层隐藏前显示回调
856
- */
857
- function onPopupBeforeHide() {
858
-
859
- // 隐藏弹出层
860
- showPopup.value = false
861
- }
862
-
863
865
  /**
864
866
  * 对话框显示前回调
865
867
  */
@@ -872,16 +874,6 @@ export default {
872
874
  popupRef.value.hide()
873
875
  }
874
876
 
875
- /**
876
- * 对话框显示回调
877
- */
878
- function onDialogShow() {
879
-
880
- // 表格加载(只加载一次)
881
- $table.tableLoad()
882
- .finally()
883
- }
884
-
885
877
  /**
886
878
  * 对话框隐藏后回调
887
879
  */
@@ -914,37 +906,47 @@ export default {
914
906
  * 对话框点击确认回调
915
907
  */
916
908
  function onDialogConfirm(data) {
917
- selected.value = [...data]
909
+
910
+ // 触发更新值
911
+ emitModelValue([...data])
918
912
  }
919
913
 
920
914
  /**
921
915
  * 单击快捷表格行
922
916
  */
923
- function quickTableRowClick(e, row, index) {
917
+ function quickTableRowClick(e, row) {
924
918
 
925
919
  // 如果为多选
926
920
  if (props.multiple) {
927
921
 
922
+ // 克隆已选数据
923
+ const _selected = [...selected.value]
924
+
928
925
  const opt = {}
929
926
  opt[props.valueKey] = row[props.valueKey]
930
927
 
931
928
  // 获取当前数据索引
932
- const itemIndex = _.findIndex(selected.value, opt)
929
+ const itemIndex = _.findIndex(_selected, opt)
933
930
 
934
931
  // 如果不存在
935
932
  if (itemIndex === -1) {
936
933
  // 则添加
937
- selected.value.push(row)
934
+ _selected.push(row)
938
935
 
939
936
  // 否则
940
937
  } else {
941
938
  // 删除
942
- selected.value.splice(itemIndex, 1)
939
+ _selected.splice(itemIndex, 1)
943
940
  }
944
941
 
942
+ // 触发更新值
943
+ emitModelValue(_selected)
944
+
945
945
  // 否则为单选
946
946
  } else {
947
- selected.value = [ row ]
947
+
948
+ // 触发更新值
949
+ emitModelValue([ row ])
948
950
 
949
951
  // 隐藏弹出层
950
952
  popupRef.value.hide()
@@ -985,15 +987,6 @@ export default {
985
987
 
986
988
  // ==========【生命周期】=========================================================================================
987
989
 
988
- /**
989
- * 实例被挂载后调用
990
- */
991
- onMounted(async function() {
992
-
993
- // 初始加载选择数据
994
- await onLoadSelected()
995
- })
996
-
997
990
  /**
998
991
  * 在组件因为响应式状态变更而更新其 DOM 树之后调用
999
992
  */
@@ -1041,17 +1034,11 @@ export default {
1041
1034
  // 字段清空触发
1042
1035
  onFieldClear,
1043
1036
 
1044
- // 弹出层获取焦点触发
1045
- onPopupFocus,
1046
1037
  // 弹出层显示回调
1047
1038
  onPopupShow,
1048
- // 弹出层隐藏前显示回调
1049
- onPopupBeforeHide,
1050
1039
 
1051
1040
  // 对话框显示前回调
1052
1041
  onDialogBeforeShow,
1053
- // 对话框显示回调
1054
- onDialogShow,
1055
1042
  // 对话框隐藏后回调
1056
1043
  onDialogHide,
1057
1044
  // 对话框点击确认回调
@@ -1059,6 +1046,9 @@ export default {
1059
1046
 
1060
1047
  // 单击快捷表格行
1061
1048
  quickTableRowClick,
1049
+
1050
+ // 触发更新值
1051
+ emitModelValue,
1062
1052
  }
1063
1053
  },
1064
1054
  }
@@ -81,9 +81,9 @@
81
81
  no-refocus
82
82
  no-focus
83
83
  fit
84
- @focus="onPopupFocus"
84
+ @focus="onFieldFocus"
85
85
  @show="onPopupShow"
86
- @before-hide="onPopupBeforeHide"
86
+ @before-hide="showPopup = false"
87
87
  v-if="! readonly"
88
88
  >
89
89
  <q-card>
@@ -96,10 +96,10 @@
96
96
  :nodes="nodes"
97
97
  :node-key="nodeKey"
98
98
  :label-key="labelKey"
99
+ :ticked="treeTicked"
100
+ @update:ticked="emitModelValue"
99
101
  v-model:expanded="treeExpanded"
100
102
  :tick-strategy="currentTickStrategy"
101
- :ticked="treeTicked"
102
- @update:ticked="onUpdateTicked"
103
103
  :accordion="accordion"
104
104
  >
105
105
  <template v-slot:default-header="{ node }">
@@ -214,15 +214,15 @@ export default {
214
214
  // 树节点
215
215
  const treeRef = ref(null)
216
216
 
217
- // 树选择数据
218
- const treeTicked = ref(formatModelValue())
219
-
220
217
  // tree all
221
218
  let treeAll = getTreeAll()
222
219
 
223
220
  // 树展开数据
224
221
  const treeExpanded = ref(getExpanded())
225
222
 
223
+ // 树选择数据
224
+ const treeTicked = ref(formatModelValue(props.modelValue))
225
+
226
226
  // ==========【计算属性】=========================================================================================
227
227
 
228
228
  /**
@@ -260,7 +260,7 @@ export default {
260
260
  /**
261
261
  * 监听节点数组
262
262
  */
263
- watch(()=>props.nodes, function () {
263
+ watch(() => props.nodes, function () {
264
264
  // 更新 tree all
265
265
  treeAll = getTreeAll()
266
266
  })
@@ -268,10 +268,10 @@ export default {
268
268
  /**
269
269
  * 监听声明值
270
270
  */
271
- watch(()=>props.modelValue, function() {
271
+ watch(() => props.modelValue, function(val) {
272
272
 
273
273
  // 设置选中数据
274
- treeTicked.value = formatModelValue()
274
+ treeTicked.value = formatModelValue(val)
275
275
 
276
276
  // 设置输入框焦点
277
277
  setInputFocus()
@@ -377,25 +377,27 @@ export default {
377
377
  /**
378
378
  * 格式化传值
379
379
  */
380
- function formatModelValue() {
380
+ function formatModelValue(val) {
381
+
382
+ // 如果是多选
381
383
  if (props.multiple) {
382
- if (utils.isValidArray(props.modelValue)) {
383
- return props.modelValue
384
- }
385
- return []
384
+ return utils.isValidArray(val) ? val : []
386
385
  }
387
386
 
388
- if (utils.isRequired(props.modelValue)) {
389
- return [props.modelValue]
387
+ // 如果为有效值
388
+ if (utils.isRequired(val)) {
389
+ return [ val ]
390
390
  }
391
391
 
392
392
  return []
393
393
  }
394
394
 
395
395
  /**
396
- * 更新选择树数据回调
396
+ * 触发更新值
397
397
  */
398
- function onUpdateTicked(val) {
398
+ function emitModelValue(val) {
399
+
400
+ // 触发更新值
399
401
  emit('update:modelValue', val)
400
402
  }
401
403
 
@@ -409,23 +411,32 @@ export default {
409
411
 
410
412
  // 如果是父节点
411
413
  if (utils.isValidArray(children)) {
414
+
412
415
  // 则无任何操作
413
416
  return
414
417
  }
415
418
 
416
- const newTicked = [...treeTicked.value]
419
+ // 克隆已选树数据
420
+ const _ticked = [...treeTicked.value]
421
+
422
+ // 获取值在树数据中的索引
423
+ const index = utils.indexOf(_ticked, id)
417
424
 
418
425
  // 如果在数据中
419
- const index = utils.indexOf(newTicked, id)
420
426
  if (index > -1) {
421
- newTicked.splice(index, 1)
427
+ // 则删除
428
+ _ticked.splice(index, 1)
429
+ // 否则
422
430
  } else {
423
- newTicked.push(id)
431
+ // 添加
432
+ _ticked.push(id)
424
433
  }
425
434
 
435
+ // 触发更新值
426
436
  // 设置树选择数据
427
- emit('update:modelValue', newTicked)
437
+ emitModelValue(_ticked)
428
438
 
439
+ // 否则是单选
429
440
  } else {
430
441
 
431
442
  if (
@@ -438,8 +449,9 @@ export default {
438
449
  return
439
450
  }
440
451
 
452
+ // 触发更新值
441
453
  // 设置树选择数据
442
- emit('update:modelValue', id)
454
+ emitModelValue(id)
443
455
 
444
456
  // 则停止冒泡
445
457
  e.preventDefault()
@@ -451,12 +463,19 @@ export default {
451
463
  }
452
464
 
453
465
  /**
454
- * 移除单个
466
+ * 移除单个节点
455
467
  */
456
468
  function onRemoveItem(index) {
457
- const newValue = [...treeTicked.value]
458
- newValue.splice(index, 1)
459
- emit('update:modelValue', newValue)
469
+
470
+ // 克隆已选树数据
471
+ const _ticked = [...treeTicked.value]
472
+
473
+ // 删除该节点
474
+ _ticked.splice(index, 1)
475
+
476
+ // 触发更新值
477
+ // 设置树选择数据
478
+ emitModelValue(_ticked)
460
479
  }
461
480
 
462
481
  /**
@@ -497,27 +516,14 @@ export default {
497
516
  */
498
517
  function onFieldClear() {
499
518
 
500
- // 更新值
501
- emit('update:modelValue', props.multiple ? [] : null)
519
+ // 触发更新值
520
+ // 清空树数据
521
+ emitModelValue(props.multiple ? [] : null)
502
522
 
503
523
  // 隐藏弹出层
504
524
  popupRef.value.hide()
505
525
  }
506
526
 
507
- /**
508
- * 弹出层获取焦点触发
509
- */
510
- function onPopupFocus(e) {
511
-
512
- // 停止冒泡
513
- e.stopPropagation()
514
-
515
- // 设置输入框焦点
516
- setInputFocus()
517
-
518
- window.scrollTo(window.pageXOffset || window.scrollX || document.body.scrollLeft || 0, 0)
519
- }
520
-
521
527
  /**
522
528
  * 弹出层显示回调
523
529
  */
@@ -530,15 +536,6 @@ export default {
530
536
  setInputFocus()
531
537
  }
532
538
 
533
- /**
534
- * 弹出层隐藏前显示回调
535
- */
536
- function onPopupBeforeHide() {
537
-
538
- // 隐藏弹出层
539
- showPopup.value = false
540
- }
541
-
542
539
  /**
543
540
  * 设置输入框文字选中
544
541
  */
@@ -604,8 +601,8 @@ export default {
604
601
  // 当前节点选择策略
605
602
  currentTickStrategy,
606
603
 
607
- // 更新选择树数据回调
608
- onUpdateTicked,
604
+ // 触发更新值
605
+ emitModelValue,
609
606
  // 点击节点
610
607
  onNode,
611
608
  // 移除单个
@@ -618,12 +615,8 @@ export default {
618
615
  // 字段清空触发
619
616
  onFieldClear,
620
617
 
621
- // 弹出层获取焦点触发
622
- onPopupFocus,
623
618
  // 弹出层显示回调
624
619
  onPopupShow,
625
- // 弹出层隐藏前显示回调
626
- onPopupBeforeHide,
627
620
  }
628
621
  },
629
622
  }
@@ -35,9 +35,9 @@ export default {
35
35
  // 值是否为数组
36
36
  valueArray: Boolean,
37
37
  // 修改前值
38
- formatBefore: [Function, Object, Boolean],
38
+ formatBefore: [ Function, Object, Boolean ],
39
39
  // 修改后值
40
- formatAfter: [Function, Object, Boolean],
40
+ formatAfter: [ Function, Object, Boolean ],
41
41
  },
42
42
 
43
43
  /**
@@ -72,10 +72,11 @@ export default {
72
72
  /**
73
73
  * 监听声明值
74
74
  */
75
- watch(()=>props.modelValue, function (val) {
75
+ watch(() => props.modelValue, function (val) {
76
76
 
77
77
  // 格式化声明值
78
78
  currentValue.value = formatModelValue(val)
79
+
79
80
  }, {
80
81
  // 深度监听
81
82
  deep: true,
@@ -165,8 +166,6 @@ export default {
165
166
  */
166
167
  function formatStringValue(val, params, valueArray) {
167
168
 
168
- console.log(val, params, valueArray)
169
-
170
169
  const o = Object.assign({
171
170
  // 替换内容
172
171
  replace: /\n|\,|\s+/g,
@@ -283,7 +283,8 @@ export default {
283
283
  // 如果当前值 !== 声明值
284
284
  const rawModelValue = formatToModelValue(currentValue.value)
285
285
  if (rawModelValue !== props.modelValue) {
286
- // 则更新值
286
+
287
+ // 触发更新值
287
288
  emitModelValue(rawModelValue)
288
289
  }
289
290
 
@@ -292,7 +293,7 @@ export default {
292
293
  /**
293
294
  * 监听声明值
294
295
  */
295
- watch(()=>props.modelValue, function (val) {
296
+ watch(() => props.modelValue, function (val) {
296
297
 
297
298
  // 格式化为当前值
298
299
  val = formatToCurrentValue(val, true)
@@ -325,10 +326,11 @@ export default {
325
326
  // ==========【方法】=============================================================================================
326
327
 
327
328
  /**
328
- * 更新值
329
+ * 触发更新值
329
330
  */
330
331
  function emitModelValue(val) {
331
- // 更新值
332
+
333
+ // 触发更新值
332
334
  emit('update:modelValue', val)
333
335
  }
334
336
 
@@ -457,7 +459,7 @@ export default {
457
459
  // 将当前值转为声明值
458
460
  val = formatToModelValue(val)
459
461
 
460
- // 更新值
462
+ // 触发更新值
461
463
  emitModelValue(val)
462
464
 
463
465
  // 失去焦点触发
@@ -485,7 +487,7 @@ export default {
485
487
  // 更新当前值
486
488
  currentValue.value = val
487
489
 
488
- // 更新值
490
+ // 触发更新值
489
491
  emitModelValue(formatToModelValue(val))
490
492
  }
491
493
  }
@@ -352,7 +352,7 @@ export default {
352
352
  if (utils.isValidObject(res)) {
353
353
 
354
354
  // 设置表格传参
355
- $table.tableQuery.value = res
355
+ $table.setQuery(res)
356
356
 
357
357
  // 表格重新加载
358
358
  $table.tableReload()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netang/quasar",
3
- "version": "0.0.37",
3
+ "version": "0.0.40",
4
4
  "description": "netang-quasar",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -13,6 +13,16 @@ $dark-td-bg-color: $dark;
13
13
 
14
14
  &.q-table {
15
15
  &--dense {
16
+ // 复选框
17
+ .q-table {
18
+ th,
19
+ td {
20
+ &.q-table--col-auto-width:first-child {
21
+ padding: 0 12px;
22
+ }
23
+ }
24
+ }
25
+
16
26
  thead tr,
17
27
  tbody tr,
18
28
  tbody td {
package/utils/$table.js CHANGED
@@ -217,9 +217,6 @@ function create(params) {
217
217
  // 表格宫格
218
218
  const tableGrid = ref(o.showGrid && isCache ? utils.storage.get('table:grid:' + cacheName) === true : false)
219
219
 
220
- // 表格传参
221
- const tableQuery = ref({})
222
-
223
220
  // 表格请求参数(将表格传参中的搜索参数剥离掉, 剩下的直接当做参数传递给服务器)
224
221
  let tableRequestQuery = {}
225
222
 
@@ -371,10 +368,12 @@ function create(params) {
371
368
  })
372
369
  }
373
370
 
371
+ // ==========【方法】================================================================================================
372
+
374
373
  /**
375
- * 监听表格传参
374
+ * 设置表格传参
376
375
  */
377
- watch(tableQuery, function (query) {
376
+ function setQuery(query) {
378
377
 
379
378
  if (utils.isValidObject(query)) {
380
379
 
@@ -475,13 +474,8 @@ function create(params) {
475
474
  }
476
475
 
477
476
  tableRequestQuery = {}
477
+ }
478
478
 
479
- }, {
480
- // 深度监听
481
- deep: true,
482
- })
483
-
484
- // ==========【方法】================================================================================================
485
479
 
486
480
  /**
487
481
  * 表格是否已加载
@@ -892,8 +886,6 @@ function create(params) {
892
886
 
893
887
  // 表格宫格
894
888
  tableGrid,
895
- // 表格传参
896
- tableQuery,
897
889
  // 表格合计
898
890
  tableSummary,
899
891
  // 表格搜索数据
@@ -901,6 +893,8 @@ function create(params) {
901
893
  // 表格搜索参数
902
894
  tableSearchOptions,
903
895
 
896
+ // 设置表格传参
897
+ setQuery,
904
898
  // 表格是否已加载
905
899
  isTableLoaded,
906
900
  // 表格加载(只加载一次)