eoss 0.1.0-alpha.44 → 0.1.0-alpha.45

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 (45) hide show
  1. package/lib/button-group.js +11 -9
  2. package/lib/button.js +5 -3
  3. package/lib/cascader.js +3 -3
  4. package/lib/color-picker.js +6 -3
  5. package/lib/date-picker.js +5 -3
  6. package/lib/eoss.common.js +516 -188
  7. package/lib/index.js +1 -1
  8. package/lib/input-number.js +6 -2
  9. package/lib/input.js +148 -87
  10. package/lib/select.js +212 -11
  11. package/lib/switch.js +6 -3
  12. package/lib/table-column.js +10 -1
  13. package/lib/table.js +64 -22
  14. package/lib/tag.js +2 -0
  15. package/lib/theme-chalk/base.css +1 -1
  16. package/lib/theme-chalk/cascader.css +1 -1
  17. package/lib/theme-chalk/icons.css +1 -1
  18. package/lib/theme-chalk/index.css +1 -1
  19. package/lib/theme-chalk/main.css +1 -1
  20. package/lib/theme-chalk/pagination.css +1 -1
  21. package/lib/theme-chalk/select.css +1 -1
  22. package/lib/theme-chalk/table-column.css +1 -1
  23. package/lib/theme-chalk/table.css +1 -1
  24. package/lib/theme-chalk/tag.css +1 -1
  25. package/lib/time-picker.js +5 -3
  26. package/lib/time-select.js +5 -3
  27. package/package.json +1 -1
  28. package/packages/button/src/button-group.vue +9 -7
  29. package/packages/button/src/button.vue +7 -5
  30. package/packages/cascader/src/cascader.vue +1 -1
  31. package/packages/color-picker/src/color-picker.vue +4 -1
  32. package/packages/date-picker/src/picker.vue +3 -1
  33. package/packages/input/src/input.vue +94 -60
  34. package/packages/input-number/src/input-number.vue +5 -1
  35. package/packages/select/src/select.vue +182 -12
  36. package/packages/switch/src/switch.vue +4 -1
  37. package/packages/table/src/table-column.js +7 -1
  38. package/packages/table/src/table-header.js +52 -7
  39. package/packages/table/src/util.js +3 -0
  40. package/packages/tag/src/tag.vue +2 -0
  41. package/packages/theme-chalk/src/base.scss +7 -0
  42. package/packages/theme-chalk/src/icons.scss +13 -1
  43. package/packages/theme-chalk/src/table.scss +12 -2
  44. package/packages/theme-chalk/src/tag.scss +303 -242
  45. package/src/index.js +1 -1
@@ -142,7 +142,7 @@ module.exports = require("vue");
142
142
  // ESM COMPAT FLAG
143
143
  __webpack_require__.r(__webpack_exports__);
144
144
 
145
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=1bf5c763&
145
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=40f587bb&
146
146
  var render = function () {
147
147
  var _vm = this
148
148
  var _h = _vm.$createElement
@@ -312,7 +312,7 @@ var staticRenderFns = []
312
312
  render._withStripped = true
313
313
 
314
314
 
315
- // CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=1bf5c763&
315
+ // CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=40f587bb&
316
316
 
317
317
  // EXTERNAL MODULE: external "eoss/lib/input"
318
318
  var input_ = __webpack_require__(14);
@@ -795,7 +795,10 @@ var repeat_click = __webpack_require__(105);
795
795
  }
796
796
  },
797
797
  mounted: function mounted() {
798
+ // 只读态下内部 es-input 被 v-if 移除,ref 不存在,需与 updated 同样防护
799
+ if (!this.$refs || !this.$refs.input) return;
798
800
  var innerInput = this.$refs.input.$refs.input;
801
+ if (!innerInput) return;
799
802
  innerInput.setAttribute('role', 'spinbutton');
800
803
  innerInput.setAttribute('aria-valuemax', this.max);
801
804
  innerInput.setAttribute('aria-valuemin', this.min);
@@ -805,6 +808,7 @@ var repeat_click = __webpack_require__(105);
805
808
  updated: function updated() {
806
809
  if (!this.$refs || !this.$refs.input) return;
807
810
  var innerInput = this.$refs.input.$refs.input;
811
+ if (!innerInput) return;
808
812
  innerInput.setAttribute('aria-valuenow', this.currentValue);
809
813
  }
810
814
  });
package/lib/input.js CHANGED
@@ -3619,7 +3619,7 @@ module.exports = require("vue");
3619
3619
  // ESM COMPAT FLAG
3620
3620
  __webpack_require__.r(__webpack_exports__);
3621
3621
 
3622
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.vue?vue&type=template&id=782c4367&
3622
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.vue?vue&type=template&id=7d4041a6&
3623
3623
  var render = function () {
3624
3624
  var _vm = this
3625
3625
  var _h = _vm.$createElement
@@ -3684,62 +3684,76 @@ var render = function () {
3684
3684
  2
3685
3685
  )
3686
3686
  : _vm._e(),
3687
- _vm.type === "password" ||
3688
- (_vm.showPassword && !_vm.passwordVisible)
3689
- ? _c("input", {
3690
- staticClass: "es-input__hidden",
3691
- staticStyle: {
3692
- position: "absolute",
3693
- top: "-9999px",
3694
- left: "-9999px",
3695
- width: "0",
3696
- height: "0",
3697
- opacity: "0",
3698
- },
3699
- attrs: { type: "password", autocomplete: "off" },
3700
- })
3701
- : _vm._e(),
3702
- _vm.type !== "textarea"
3703
- ? _c(
3704
- "input",
3705
- _vm._b(
3706
- {
3707
- ref: "input",
3708
- staticClass: "es-input__inner",
3709
- class: { "is-round": _vm.round },
3710
- style: _vm.innerStyle,
3711
- attrs: {
3712
- tabindex: _vm.tabindex,
3713
- type: _vm.showPassword
3714
- ? _vm.passwordVisible
3715
- ? "text"
3716
- : "password"
3717
- : _vm.type,
3718
- disabled: _vm.inputDisabled,
3719
- readonly: _vm.inputReadonly,
3720
- autocomplete:
3721
- _vm.type === "password" ||
3722
- (_vm.showPassword && !_vm.passwordVisible)
3723
- ? "new-password"
3724
- : _vm.autoComplete || _vm.autocomplete,
3725
- "aria-label": _vm.label,
3726
- },
3727
- on: {
3728
- compositionstart: _vm.handleCompositionStart,
3729
- compositionupdate: _vm.handleCompositionUpdate,
3730
- compositionend: _vm.handleCompositionEnd,
3731
- input: _vm.handleInput,
3732
- focus: _vm.handleFocus,
3733
- blur: _vm.handleBlur,
3734
- change: _vm.handleChange,
3735
- },
3736
- },
3737
- "input",
3738
- _vm.$attrs,
3739
- false
3740
- )
3741
- )
3742
- : _vm._e(),
3687
+ _vm.inputReadonly
3688
+ ? _c("div", { staticClass: "es-field-readonly" }, [
3689
+ _vm._v(
3690
+ "\n " +
3691
+ _vm._s(
3692
+ _vm.passwordVisible
3693
+ ? _vm.nativeInputValue
3694
+ : _vm.maskedInputValue
3695
+ ) +
3696
+ "\n "
3697
+ ),
3698
+ ])
3699
+ : [
3700
+ _vm.type === "password" ||
3701
+ (_vm.showPassword && !_vm.passwordVisible)
3702
+ ? _c("input", {
3703
+ staticClass: "es-input__hidden",
3704
+ staticStyle: {
3705
+ position: "absolute",
3706
+ top: "-9999px",
3707
+ left: "-9999px",
3708
+ width: "0",
3709
+ height: "0",
3710
+ opacity: "0",
3711
+ },
3712
+ attrs: { type: "password", autocomplete: "off" },
3713
+ })
3714
+ : _vm._e(),
3715
+ _vm.type !== "textarea"
3716
+ ? _c(
3717
+ "input",
3718
+ _vm._b(
3719
+ {
3720
+ ref: "input",
3721
+ staticClass: "es-input__inner",
3722
+ class: { "is-round": _vm.round },
3723
+ style: _vm.innerStyle,
3724
+ attrs: {
3725
+ tabindex: _vm.tabindex,
3726
+ type: _vm.showPassword
3727
+ ? _vm.passwordVisible
3728
+ ? "text"
3729
+ : "password"
3730
+ : _vm.type,
3731
+ disabled: _vm.inputDisabled,
3732
+ readonly: _vm.nativeReadonly,
3733
+ autocomplete:
3734
+ _vm.type === "password" ||
3735
+ (_vm.showPassword && !_vm.passwordVisible)
3736
+ ? "new-password"
3737
+ : _vm.autoComplete || _vm.autocomplete,
3738
+ "aria-label": _vm.label,
3739
+ },
3740
+ on: {
3741
+ compositionstart: _vm.handleCompositionStart,
3742
+ compositionupdate: _vm.handleCompositionUpdate,
3743
+ compositionend: _vm.handleCompositionEnd,
3744
+ input: _vm.handleInput,
3745
+ focus: _vm.handleFocus,
3746
+ blur: _vm.handleBlur,
3747
+ change: _vm.handleChange,
3748
+ },
3749
+ },
3750
+ "input",
3751
+ _vm.$attrs,
3752
+ false
3753
+ )
3754
+ )
3755
+ : _vm._e(),
3756
+ ],
3743
3757
  _vm.$slots.prefix || _vm.prefix || _vm.prefixIcon
3744
3758
  ? _c(
3745
3759
  "span",
@@ -3880,35 +3894,50 @@ var render = function () {
3880
3894
  )
3881
3895
  : _vm._e(),
3882
3896
  ]
3883
- : _c(
3884
- "textarea",
3885
- _vm._b(
3886
- {
3887
- ref: "textarea",
3888
- staticClass: "es-textarea__inner",
3889
- style: _vm.textareaStyle,
3890
- attrs: {
3891
- tabindex: _vm.tabindex,
3892
- disabled: _vm.inputDisabled,
3893
- readonly: _vm.inputReadonly,
3894
- autocomplete: _vm.autoComplete || _vm.autocomplete,
3895
- "aria-label": _vm.label,
3896
- },
3897
- on: {
3898
- compositionstart: _vm.handleCompositionStart,
3899
- compositionupdate: _vm.handleCompositionUpdate,
3900
- compositionend: _vm.handleCompositionEnd,
3901
- input: _vm.handleInput,
3902
- focus: _vm.handleFocus,
3903
- blur: _vm.handleBlur,
3904
- change: _vm.handleChange,
3905
- },
3906
- },
3907
- "textarea",
3908
- _vm.$attrs,
3909
- false
3910
- )
3911
- ),
3897
+ : [
3898
+ _vm.inputReadonly
3899
+ ? _c(
3900
+ "div",
3901
+ {
3902
+ staticClass:
3903
+ "es-field-readonly es-field-readonly--textarea",
3904
+ staticStyle: {
3905
+ "white-space": "pre-wrap",
3906
+ "word-break": "break-all",
3907
+ },
3908
+ },
3909
+ [_vm._v("\n " + _vm._s(_vm.nativeInputValue) + "\n ")]
3910
+ )
3911
+ : _c(
3912
+ "textarea",
3913
+ _vm._b(
3914
+ {
3915
+ ref: "textarea",
3916
+ staticClass: "es-textarea__inner",
3917
+ style: _vm.textareaStyle,
3918
+ attrs: {
3919
+ tabindex: _vm.tabindex,
3920
+ disabled: _vm.inputDisabled,
3921
+ readonly: _vm.nativeReadonly,
3922
+ autocomplete: _vm.autoComplete || _vm.autocomplete,
3923
+ "aria-label": _vm.label,
3924
+ },
3925
+ on: {
3926
+ compositionstart: _vm.handleCompositionStart,
3927
+ compositionupdate: _vm.handleCompositionUpdate,
3928
+ compositionend: _vm.handleCompositionEnd,
3929
+ input: _vm.handleInput,
3930
+ focus: _vm.handleFocus,
3931
+ blur: _vm.handleBlur,
3932
+ change: _vm.handleChange,
3933
+ },
3934
+ },
3935
+ "textarea",
3936
+ _vm.$attrs,
3937
+ false
3938
+ )
3939
+ ),
3940
+ ],
3912
3941
  _vm.isWordLimitVisible && _vm.type === "textarea"
3913
3942
  ? _c("span", { staticClass: "es-input__count" }, [
3914
3943
  _vm._v(_vm._s(_vm.textLength) + "/" + _vm._s(_vm.upperLimit)),
@@ -3923,7 +3952,7 @@ var staticRenderFns = []
3923
3952
  render._withStripped = true
3924
3953
 
3925
3954
 
3926
- // CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=template&id=782c4367&
3955
+ // CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=template&id=7d4041a6&
3927
3956
 
3928
3957
  // EXTERNAL MODULE: ./src/mixins/emitter.js
3929
3958
  var emitter = __webpack_require__(15);
@@ -4177,6 +4206,21 @@ var resize_event = __webpack_require__(39);
4177
4206
  //
4178
4207
  //
4179
4208
  //
4209
+ //
4210
+ //
4211
+ //
4212
+ //
4213
+ //
4214
+ //
4215
+ //
4216
+ //
4217
+ //
4218
+ //
4219
+ //
4220
+ //
4221
+ //
4222
+ //
4223
+ //
4180
4224
 
4181
4225
 
4182
4226
 
@@ -4278,6 +4322,14 @@ var resize_event = __webpack_require__(39);
4278
4322
  * @default false
4279
4323
  */
4280
4324
  readonly: Boolean,
4325
+ /**
4326
+ * 仅绑定原生 input 的 readonly 属性(行为标志,供 select/cascader/picker 内部使用)
4327
+ * @type {Boolean}
4328
+ * @default false
4329
+ * @description 这些复合组件给内部 es-input 传的 readonly 是"禁止打字但保留输入框结构"
4330
+ * 的行为标志(普通态也常为 true),若走 readonly 会命中只读 div 分支导致布局破坏
4331
+ */
4332
+ nativeReadonly: Boolean,
4281
4333
  /**
4282
4334
  * 输入框类型
4283
4335
  * @type {String}
@@ -4453,6 +4505,15 @@ var resize_event = __webpack_require__(39);
4453
4505
  nativeInputValue: function nativeInputValue() {
4454
4506
  return this.value === null || this.value === undefined ? '' : String(this.value);
4455
4507
  },
4508
+
4509
+ // 只读 div 用:密码型(含 showPassword 未点眼预览)按原生表现打码,
4510
+ // div 无法应用 type="password",直接以掩码字符回显
4511
+ maskedInputValue: function maskedInputValue() {
4512
+ if (this.type !== 'password' && !(this.showPassword && !this.passwordVisible)) {
4513
+ return this.nativeInputValue;
4514
+ }
4515
+ return '*'.repeat(this.nativeInputValue.length);
4516
+ },
4456
4517
  showClear: function showClear() {
4457
4518
  return this.clearable && !this.inputDisabled && !this.inputReadonly && this.nativeInputValue && (this.focused || this.hovering);
4458
4519
  },
package/lib/select.js CHANGED
@@ -5571,7 +5571,7 @@ var doDecrypt = function doDecrypt(_ref2) {
5571
5571
  // ESM COMPAT FLAG
5572
5572
  __webpack_require__.r(__webpack_exports__);
5573
5573
 
5574
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=4baed3ce&
5574
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=f4dfce0a&
5575
5575
  var render = function () {
5576
5576
  var _vm = this
5577
5577
  var _h = _vm.$createElement
@@ -5905,7 +5905,7 @@ var render = function () {
5905
5905
  autocomplete: _vm.autocomplete,
5906
5906
  size: _vm.selectSize,
5907
5907
  disabled: _vm.selectDisabled,
5908
- readonly: _vm.inputReadonly,
5908
+ "native-readonly": _vm.inputReadonly,
5909
5909
  "validate-event": false,
5910
5910
  tabindex: _vm.tabindex,
5911
5911
  prefix: _vm.prefix,
@@ -6083,6 +6083,12 @@ var render = function () {
6083
6083
  "es-scrollbar",
6084
6084
  {
6085
6085
  directives: [
6086
+ {
6087
+ name: "loading",
6088
+ rawName: "v-loading",
6089
+ value: _vm.isLoading,
6090
+ expression: "isLoading",
6091
+ },
6086
6092
  {
6087
6093
  name: "show",
6088
6094
  rawName: "v-show",
@@ -6102,6 +6108,14 @@ var render = function () {
6102
6108
  "wrap-class": "es-select-dropdown__wrap",
6103
6109
  "view-class": "es-select-dropdown__list",
6104
6110
  listener: true,
6111
+ "infinite-scroll": _vm.innerInfiniteScroll,
6112
+ "infinite-scroll-disabled":
6113
+ _vm.innerInfiniteScrollDisabled,
6114
+ "infinite-scroll-distance":
6115
+ _vm.infiniteScrollDistance,
6116
+ "infinite-scroll-delay": _vm.infiniteScrollDelay,
6117
+ "infinite-scroll-immediate":
6118
+ _vm.infiniteScrollImmediate,
6105
6119
  },
6106
6120
  },
6107
6121
  [
@@ -6235,6 +6249,19 @@ var render = function () {
6235
6249
  : _vm._e(),
6236
6250
  ]
6237
6251
  }),
6252
+ _vm.lazyEnabled && _vm.lazyFinished
6253
+ ? _c(
6254
+ "div",
6255
+ {
6256
+ staticClass: "es-select-dropdown__finished",
6257
+ },
6258
+ [
6259
+ _vm._v(
6260
+ "\n 没有更多数据了\n "
6261
+ ),
6262
+ ]
6263
+ )
6264
+ : _vm._e(),
6238
6265
  ],
6239
6266
  2
6240
6267
  ),
@@ -6278,7 +6305,7 @@ var staticRenderFns = []
6278
6305
  render._withStripped = true
6279
6306
 
6280
6307
 
6281
- // CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=4baed3ce&
6308
+ // CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=f4dfce0a&
6282
6309
 
6283
6310
  // EXTERNAL MODULE: ./src/mixins/emitter.js
6284
6311
  var emitter = __webpack_require__(15);
@@ -7099,6 +7126,19 @@ var _this = undefined;
7099
7126
  //
7100
7127
  //
7101
7128
  //
7129
+ //
7130
+ //
7131
+ //
7132
+ //
7133
+ //
7134
+ //
7135
+ //
7136
+ //
7137
+ //
7138
+ //
7139
+ //
7140
+ //
7141
+ //
7102
7142
 
7103
7143
 
7104
7144
 
@@ -7541,7 +7581,70 @@ var _this = undefined;
7541
7581
  * 选项值的键名
7542
7582
  * @type {String}
7543
7583
  */
7544
- valueKey: String
7584
+ valueKey: String,
7585
+ /**
7586
+ * 无限滚动回调:下拉列表滚动到底部时触发,用于分页加载更多选项
7587
+ * @type {Function}
7588
+ * @description 选项数据由外部接口分页提供时,在回调中请求下一页并追加到 data;
7589
+ * 没有更多数据时由外部置 infiniteScrollDisabled 为 true 停止触发
7590
+ */
7591
+ infiniteScroll: Function,
7592
+ /**
7593
+ * 是否禁用无限滚动
7594
+ * @type {Boolean}
7595
+ * @default false
7596
+ */
7597
+ infiniteScrollDisabled: Boolean,
7598
+ /**
7599
+ * 距底部多少 px 时触发无限滚动
7600
+ * @type {Number}
7601
+ * @default 0
7602
+ */
7603
+ infiniteScrollDistance: {
7604
+ type: Number,
7605
+ default: 0
7606
+ },
7607
+ /**
7608
+ * 无限滚动回调的节流间隔(ms),透传给内部 es-scrollbar
7609
+ * @type {Number}
7610
+ * @default 200
7611
+ */
7612
+ infiniteScrollDelay: {
7613
+ type: Number,
7614
+ default: 200
7615
+ },
7616
+ /**
7617
+ * 是否挂载后立即触发一次回调
7618
+ * @type {Boolean}
7619
+ * @default false
7620
+ * @description 与 es-scrollbar 默认值(true)不同:下拉的滚动条随 select 一起挂载,
7621
+ * 默认 true 会导致下拉尚未打开就自动请求首页,故这里默认关闭
7622
+ */
7623
+ infiniteScrollImmediate: {
7624
+ type: Boolean,
7625
+ default: false
7626
+ },
7627
+ /**
7628
+ * 是否开启选项懒加载(分页加载)
7629
+ * @type {Boolean}
7630
+ * @default false
7631
+ * @description 对 tree 为 false 的平铺 ul 列表生效,两种数据来源均支持:
7632
+ * 1. url 取数:初始化请求第一页,下拉滚动到底部时自动续拉下一页并追加(内部复用无限滚动),
7633
+ * 请求期间列表显示 loading;某页返回条数小于 pageSize 视为加载完毕停止触发
7634
+ * 2. data 外部传入(未配置 url):本地分页,先渲染前 pageSize 条,
7635
+ * 滚动到底部时同步切片追加下一页;data 变化时重置回第一页
7636
+ */
7637
+ lazy: Boolean,
7638
+ /**
7639
+ * 懒加载每页条数(url 取数时作为请求参数 pageNum/pageSize 随 param 一起 POST 给 url;
7640
+ * data 本地懒加载时作为每页切片条数)
7641
+ * @type {Number}
7642
+ * @default 50
7643
+ */
7644
+ pageSize: {
7645
+ type: Number,
7646
+ default: 20
7647
+ }
7545
7648
  },
7546
7649
 
7547
7650
  computed: {
@@ -7555,6 +7658,26 @@ var _this = undefined;
7555
7658
  return this.valueKey || (this.sysCode ? 'cciValue' : 'value');
7556
7659
  },
7557
7660
 
7661
+ // 懒加载生效条件:开启 lazy、非树形(平铺 ul 列表)、有数据来源(url 取数或 data 传入)
7662
+ lazyEnabled: function lazyEnabled() {
7663
+ return this.lazy && !this.tree && (!!this.url || this.data.length > 0);
7664
+ },
7665
+
7666
+ // 本地懒加载:未配置 url、由外部 data 传入时的分页切片模式
7667
+ localLazyEnabled: function localLazyEnabled() {
7668
+ return this.lazyEnabled && !this.url;
7669
+ },
7670
+
7671
+ // 无限滚动回调:懒加载模式走内部分页续拉,否则透传外部 infiniteScroll
7672
+ innerInfiniteScroll: function innerInfiniteScroll() {
7673
+ return this.lazyEnabled ? this.loadMoreOptions : this.infiniteScroll;
7674
+ },
7675
+
7676
+ // 无限滚动禁用:外部禁用,或懒加载中/已加载完时避免重复触发
7677
+ innerInfiniteScrollDisabled: function innerInfiniteScrollDisabled() {
7678
+ return this.infiniteScrollDisabled || this.lazyEnabled && (this.isLoading || this.lazyFinished);
7679
+ },
7680
+
7558
7681
  model: {
7559
7682
  get: function get() {
7560
7683
  if (this.multiple) {
@@ -7682,7 +7805,14 @@ var _this = undefined;
7682
7805
  watch: {
7683
7806
  data: {
7684
7807
  handler: function handler(val) {
7685
- this.results = val;
7808
+ if (this.localLazyEnabled) {
7809
+ // 本地懒加载:数据变化时重置回第一页重新切片
7810
+ this.lazyPageNum = 1;
7811
+ this.lazyFinished = false;
7812
+ this.applyLocalLazySlice();
7813
+ } else {
7814
+ this.results = val;
7815
+ }
7686
7816
  },
7687
7817
 
7688
7818
  deep: true
@@ -7865,7 +7995,12 @@ var _this = undefined;
7865
7995
  isDestroy: false,
7866
7996
  innerStyle: {},
7867
7997
  results: this.data,
7868
- _propsCache: new Map()
7998
+ // 懒加载分页状态:已加载到的页码 / 是否已加载完
7999
+ lazyPageNum: 1,
8000
+ lazyFinished: false,
8001
+ _propsCache: new Map(),
8002
+ // 是否请求中(驱动 es-scrollbar 上的 v-loading)
8003
+ isLoading: false
7869
8004
  };
7870
8005
  },
7871
8006
  created: function created() {
@@ -7896,6 +8031,10 @@ var _this = undefined;
7896
8031
 
7897
8032
  this.$on('handleOptionClick', this.handleOptionSelect);
7898
8033
  this.$on('setSelected', this.setSelected);
8034
+ // 本地懒加载:初始只渲染 data 的第一页切片
8035
+ if (this.localLazyEnabled) {
8036
+ this.applyLocalLazySlice();
8037
+ }
7899
8038
  this.debouncedGetData();
7900
8039
  },
7901
8040
  mounted: function mounted() {
@@ -7996,26 +8135,88 @@ var _this = undefined;
7996
8135
  * @param {Object} options - 配置选项
7997
8136
  * @param {String} options.url - 接口地址
7998
8137
  * @param {Object} options.params - 接口参数
8138
+ * @param {Boolean} options.append - 懒加载续拉下一页并追加(仅 lazyEnabled 时生效)
7999
8139
  */
8000
- getData: function getData(_ref) {
8140
+ getData: function getData() {
8001
8141
  var _this10 = this;
8002
8142
 
8003
- var url = _ref.url,
8143
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
8144
+ url = _ref.url,
8004
8145
  _ref$params = _ref.params,
8005
- params = _ref$params === undefined ? {} : _ref$params;
8146
+ params = _ref$params === undefined ? {} : _ref$params,
8147
+ _ref$append = _ref.append,
8148
+ append = _ref$append === undefined ? false : _ref$append;
8006
8149
 
8007
8150
  url = url || this.url;
8008
8151
  params = selectvue_type_script_lang_js_extends({}, this.param, params);
8009
- url && Object(ajax["a" /* ajax */])({
8152
+ if (!url) return;
8153
+ if (this.lazyEnabled) {
8154
+ if (append) {
8155
+ // 续拉下一页
8156
+ this.isLoading = true;
8157
+ params = selectvue_type_script_lang_js_extends({}, params, {
8158
+ pageNum: this.lazyPageNum + 1,
8159
+ pageSize: this.pageSize
8160
+ });
8161
+ } else {
8162
+ // 初始化/参数变化/远程搜索:重置分页请求第一页
8163
+ this.lazyPageNum = 1;
8164
+ this.lazyFinished = false;
8165
+ params = selectvue_type_script_lang_js_extends({}, params, { pageNum: 1, pageSize: this.pageSize });
8166
+ }
8167
+ }
8168
+ Object(ajax["a" /* ajax */])({
8010
8169
  url: url,
8011
8170
  method: 'POST',
8012
8171
  data: params
8013
8172
  }).then(function (res) {
8014
8173
  if (res.rCode === 0) {
8015
- _this10.results = res.results || [];
8174
+ var rows = res.results || [];
8175
+ if (_this10.lazyEnabled && append) {
8176
+ _this10.results = _this10.results.concat(rows);
8177
+ _this10.lazyPageNum += 1;
8178
+ } else {
8179
+ _this10.results = rows;
8180
+ }
8181
+ // 续拉时返回条数不足一页视为已加载完,停止触发并提示没有更多
8182
+ // (首页不足一页属正常小数据量,不显示提示)
8183
+ if (_this10.lazyEnabled && append && rows.length < _this10.pageSize) {
8184
+ _this10.lazyFinished = true;
8185
+ }
8016
8186
  }
8187
+ _this10.isLoading = false;
8188
+ }).catch(function () {
8189
+ _this10.isLoading = false;
8017
8190
  });
8018
8191
  },
8192
+
8193
+ /**
8194
+ * 懒加载:滚动到底部时加载下一页(由内部无限滚动触发,带防重入守卫)
8195
+ * 本地懒加载为同步切片追加,url 懒加载为异步续拉请求
8196
+ */
8197
+ loadMoreOptions: function loadMoreOptions() {
8198
+ if (!this.lazyEnabled || this.isLoading || this.lazyFinished) return;
8199
+ if (this.localLazyEnabled) {
8200
+ this.lazyPageNum += 1;
8201
+ this.applyLocalLazySlice();
8202
+ } else {
8203
+ this.getData({ append: true });
8204
+ }
8205
+ },
8206
+
8207
+ /**
8208
+ * 本地懒加载:按当前 lazyPageNum 对 data 做切片渲染(0 ~ pageNum*pageSize),
8209
+ * 翻过页且切到末尾时置 lazyFinished 停止触发并显示没有更多提示
8210
+ * (首页即覆盖全量属正常小数据量,不置位不提示)
8211
+ */
8212
+ applyLocalLazySlice: function applyLocalLazySlice() {
8213
+ var list = this.data || [];
8214
+ var end = this.lazyPageNum * this.pageSize;
8215
+ this.results = list.slice(0, end);
8216
+ if (this.lazyPageNum > 1 && end >= list.length) {
8217
+ this.lazyFinished = true;
8218
+ }
8219
+ },
8019
8220
  handleComposition: function handleComposition(event) {
8020
8221
  var _this11 = this;
8021
8222
 
package/lib/switch.js CHANGED
@@ -3612,7 +3612,7 @@ module.exports = require("vue");
3612
3612
  // ESM COMPAT FLAG
3613
3613
  __webpack_require__.r(__webpack_exports__);
3614
3614
 
3615
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/switch/src/switch.vue?vue&type=template&id=9d50ec44&
3615
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/switch/src/switch.vue?vue&type=template&id=dccc51b0&
3616
3616
  var render = function () {
3617
3617
  var _vm = this
3618
3618
  var _h = _vm.$createElement
@@ -3750,7 +3750,7 @@ var staticRenderFns = []
3750
3750
  render._withStripped = true
3751
3751
 
3752
3752
 
3753
- // CONCATENATED MODULE: ./packages/switch/src/switch.vue?vue&type=template&id=9d50ec44&
3753
+ // CONCATENATED MODULE: ./packages/switch/src/switch.vue?vue&type=template&id=dccc51b0&
3754
3754
 
3755
3755
  // EXTERNAL MODULE: ./src/mixins/emitter.js
3756
3756
  var emitter = __webpack_require__(15);
@@ -4137,7 +4137,10 @@ var migrating = __webpack_require__(46);
4137
4137
  if (this.activeColor || this.inactiveColor) {
4138
4138
  this.setBackgroundColor();
4139
4139
  }
4140
- this.$refs.input.checked = this.checked;
4140
+ // 只读态下内部 input 被 v-if 移除,需防护
4141
+ if (this.$refs.input) {
4142
+ this.$refs.input.checked = this.checked;
4143
+ }
4141
4144
  }
4142
4145
  });
4143
4146
  // CONCATENATED MODULE: ./packages/switch/src/switch.vue?vue&type=script&lang=js&