@sheinx/hooks 3.9.13 → 3.9.14-beta.10

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 (27) hide show
  1. package/cjs/common/use-click-away/index.d.ts.map +1 -1
  2. package/cjs/common/use-click-away/index.js +6 -3
  3. package/cjs/common/use-list-select/use-list-select-multiple.d.ts.map +1 -1
  4. package/cjs/common/use-list-select/use-list-select-multiple.js +11 -0
  5. package/cjs/components/use-form/use-form.d.ts.map +1 -1
  6. package/cjs/components/use-form/use-form.js +4 -1
  7. package/cjs/components/use-input/use-input-number.d.ts +1 -0
  8. package/cjs/components/use-input/use-input-number.d.ts.map +1 -1
  9. package/cjs/components/use-input/use-input-number.js +10 -5
  10. package/cjs/components/use-input/use-input-number.type.d.ts +1 -0
  11. package/cjs/components/use-input/use-input-number.type.d.ts.map +1 -1
  12. package/cjs/components/use-table/use-table-layout.d.ts.map +1 -1
  13. package/cjs/components/use-table/use-table-layout.js +41 -3
  14. package/esm/common/use-click-away/index.d.ts.map +1 -1
  15. package/esm/common/use-click-away/index.js +6 -3
  16. package/esm/common/use-list-select/use-list-select-multiple.d.ts.map +1 -1
  17. package/esm/common/use-list-select/use-list-select-multiple.js +11 -0
  18. package/esm/components/use-form/use-form.d.ts.map +1 -1
  19. package/esm/components/use-form/use-form.js +4 -1
  20. package/esm/components/use-input/use-input-number.d.ts +1 -0
  21. package/esm/components/use-input/use-input-number.d.ts.map +1 -1
  22. package/esm/components/use-input/use-input-number.js +10 -5
  23. package/esm/components/use-input/use-input-number.type.d.ts +1 -0
  24. package/esm/components/use-input/use-input-number.type.d.ts.map +1 -1
  25. package/esm/components/use-table/use-table-layout.d.ts.map +1 -1
  26. package/esm/components/use-table/use-table-layout.js +41 -3
  27. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAI7C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AACnD,wBAAgB,YAAY,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE;IAE5D,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CAC/B,QAqCA;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAI7C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AACnD,wBAAgB,YAAY,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE;IAE5D,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CAC/B,QAsCA;AAED,eAAe,YAAY,CAAC"}
@@ -22,10 +22,13 @@ function useClickAway(params) {
22
22
  });
23
23
  var target = Array.isArray(t) ? t : [t];
24
24
  var handleClickAway = (0, _usePersistFn.default)(function (event) {
25
- // @ts-ignore
25
+ var _composedPath, _composedPath2, _ref;
26
+ // composedPath() 兼容 Shadow DOM,包含事件传播路径上的所有元素
27
+ var path = (_composedPath = (_composedPath2 = (_ref = event).composedPath) === null || _composedPath2 === void 0 ? void 0 : _composedPath2.call(_ref)) !== null && _composedPath !== void 0 ? _composedPath : [event.target];
26
28
  if (target.findIndex(function (t) {
27
- var _t$current;
28
- return (_t$current = t.current) === null || _t$current === void 0 ? void 0 : _t$current.contains(event.target);
29
+ return t.current && path.some(function (n) {
30
+ return n instanceof Node && t.current.contains(n);
31
+ });
29
32
  }) > -1) {
30
33
  return;
31
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-list-select-multiple.d.ts","sourceRoot":"","sources":["use-list-select-multiple.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMtE,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;sDA6MK;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;4BAjNzB,GAAG;;qCA6PqB,MAAM;;CAoC5D,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"use-list-select-multiple.d.ts","sourceRoot":"","sources":["use-list-select-multiple.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMtE,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;sDA6MK;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;4BAjNzB,GAAG;;qCAwQqB,MAAM;;CAoC5D,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -241,11 +241,22 @@ var useListSelectMultiple = function useListSelectMultiple(props) {
241
241
  for (var j = 0; j < raws.length; j++) {
242
242
  var _item2 = raws[j];
243
243
  if (props.prediction(values[_i], _item2)) {
244
+ if (props.keepCache) context.valueDataCache.set(values[_i], _item2);
244
245
  result.push(_item2);
245
246
  raws.splice(j, 1);
246
247
  continue outer;
247
248
  }
248
249
  }
250
+ // 当前 data 找不到,从 valueDataCache 中回退匹配
251
+ if (props.keepCache && context.valueDataCache) {
252
+ var cacheValues = Array.from(context.valueDataCache.values());
253
+ for (var k = 0; k < cacheValues.length; k++) {
254
+ if (props.prediction(values[_i], cacheValues[k])) {
255
+ result.push(cacheValues[k]);
256
+ continue outer;
257
+ }
258
+ }
259
+ }
249
260
  result.push({
250
261
  IS_NOT_MATCHED_VALUE: true,
251
262
  value: values[_i]
@@ -1 +1 @@
1
- {"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA4BtE,OAAO,EAEL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAM,OAAO;;;;;;;;;wBAuTC;gBAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAAC,WAAW,CAAC,EAAE,OAAO,CAAA;aAAE;8BArQnB,MAAM;oCAoVD,OAAO,aAAoB,MAAM,IAAI;;6BAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;oCAdrB,MAAM,EAAE;sCA/SxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;qCA+WvB,MAAM,WAAW,gBAAgB;gCA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;gCAKpC,MAAM,SAAS,MAAM;kCAzJpD,MAAM,0BAAyB,qBAAqB;;;;;;;;oBA+EjD;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;0BArQnB,MAAM;gCAoVD,OAAO,aAAoB,MAAM,IAAI;;yBAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;gCAdrB,MAAM,EAAE;kCA/SxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;iCA+WvB,MAAM,WAAW,gBAAgB;4BA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;4BAKpC,MAAM,SAAS,MAAM;8BAzJpD,MAAM,0BAAyB,qBAAqB;;;CA+b9D,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA6BtE,OAAO,EAEL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAM,OAAO;;;;;;;;;wBAuTC;gBAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAAC,WAAW,CAAC,EAAE,OAAO,CAAA;aAAE;8BArQnB,MAAM;oCAsVD,OAAO,aAAoB,MAAM,IAAI;;6BAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;oCAdrB,MAAM,EAAE;sCAjTxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;qCAiXvB,MAAM,WAAW,gBAAgB;gCA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;gCAKpC,MAAM,SAAS,MAAM;kCA3JpD,MAAM,0BAAyB,qBAAqB;;;;;;;;oBA+EjD;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;0BArQnB,MAAM;gCAsVD,OAAO,aAAoB,MAAM,IAAI;;yBAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;gCAdrB,MAAM,EAAE;kCAjTxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;iCAiXvB,MAAM,WAAW,gBAAgB;4BA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;4BAKpC,MAAM,SAAS,MAAM;8BA3JpD,MAAM,0BAAyB,qBAAqB;;;CAic9D,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -28,6 +28,7 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
28
28
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
29
29
  var globalKey = '__global__&&@@';
30
30
  var SUBMIT_TIMEOUT = 10;
31
+ var RESET_TIMEOUT = 500;
31
32
  var emptyObj = {};
32
33
  var useForm = function useForm(props) {
33
34
  var _props$defaultValue = props.defaultValue,
@@ -324,6 +325,8 @@ var useForm = function useForm(props) {
324
325
  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
325
326
  validate: false
326
327
  };
328
+ // 重置保护期内(500ms),忽略子组件延迟 onChange 写回的旧值
329
+ if (context.resetTime && Date.now() - context.resetTime < RESET_TIMEOUT) return;
327
330
  onChange(function (draft) {
328
331
  var values = Object.keys(vals);
329
332
  // 针对 name 为数组模式,如 datepicker 的 name={['startTime', 'endTime']} 时,前者校验可能需要依赖后者,因此需要提前将后者数据整合至 draft 用于多字段整合校验
@@ -491,7 +494,7 @@ var useForm = function useForm(props) {
491
494
  onChange(getDefaultValue());
492
495
  clearValidate();
493
496
  update();
494
- context.resetTime = 1;
497
+ context.resetTime = Date.now();
495
498
  (_props$onReset = props.onReset) === null || _props$onReset === void 0 || _props$onReset.call(props);
496
499
  other === null || other === void 0 || (_other$onReset = other.onReset) === null || _other$onReset === void 0 || _other$onReset.call(other, e);
497
500
  };
@@ -3,6 +3,7 @@ import { InputNumberProps } from './use-input-number.type';
3
3
  declare const useNumberFormat: (props: InputNumberProps) => {
4
4
  onPlus: () => void;
5
5
  onMinus: () => void;
6
+ onClear: () => void;
6
7
  onChange: (v: string | undefined) => void;
7
8
  onBlur: (e: React.FocusEvent<HTMLInputElement, Element>) => void;
8
9
  onFocus: (e: React.FocusEvent<HTMLInputElement, Element>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"use-input-number.d.ts","sourceRoot":"","sources":["use-input-number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,QAAA,MAAM,eAAe,UAAW,gBAAgB;;;;;;;;CA2L/C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"use-input-number.d.ts","sourceRoot":"","sources":["use-input-number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,QAAA,MAAM,eAAe,UAAW,gBAAgB;;;;;;;;;CAiM/C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -34,6 +34,7 @@ var useNumberFormat = function useNumberFormat(props) {
34
34
  min = props.min,
35
35
  max = props.max,
36
36
  allowNull = props.allowNull,
37
+ clearToUndefined = props.clearToUndefined,
37
38
  _props$step = props.step,
38
39
  step = _props$step === void 0 ? 1 : _props$step,
39
40
  cancelBlurChange = props.cancelBlurChange,
@@ -54,10 +55,9 @@ var useNumberFormat = function useNumberFormat(props) {
54
55
  setInternalInputValue = _React$useState2[1];
55
56
  var focusedRef = _react.default.useRef(false);
56
57
  (0, _react.useEffect)(function () {
57
- // 聚焦编辑期间不同步外部值,避免 form 回填 defaultValue 覆盖用户输入
58
- // 但当外部值被清空时( clearable 触发),即使聚焦也需要同步
59
- if (props.value !== inernalInputValue && (!focusedRef.current || props.value == null || props.value === '')) {
60
- setInternalInputValue(getStringValue(props.value));
58
+ var stringValue = getStringValue(props.value);
59
+ if (stringValue !== inernalInputValue && (!focusedRef.current || props.value == null)) {
60
+ setInternalInputValue(stringValue);
61
61
  }
62
62
  }, [props.value]);
63
63
  var getNumberValue = function getNumberValue(value) {
@@ -183,6 +183,10 @@ var useNumberFormat = function useNumberFormat(props) {
183
183
  var num = changeValue(-step);
184
184
  if (num !== undefined) setInternalInputValue(getStringValue(num));
185
185
  });
186
+ var handleClear = (0, _usePersistFn.default)(function () {
187
+ setInternalInputValue('');
188
+ onChange === null || onChange === void 0 || onChange(clearToUndefined ? undefined : allowNull ? null : '');
189
+ });
186
190
  return _objectSpread(_objectSpread({}, (0, _useInputFormat.default)({
187
191
  value: inernalInputValue,
188
192
  type: 'number',
@@ -196,7 +200,8 @@ var useNumberFormat = function useNumberFormat(props) {
196
200
  cancelBlurChange: true
197
201
  })), {}, {
198
202
  onPlus: handlePlus,
199
- onMinus: handleMinus
203
+ onMinus: handleMinus,
204
+ onClear: handleClear
200
205
  });
201
206
  };
202
207
  var _default = exports.default = useNumberFormat;
@@ -23,6 +23,7 @@ export interface InputNumberProps extends Omit<InputFormatProps, 'value' | 'onCh
23
23
  * @cn 清空后值为 null
24
24
  */
25
25
  allowNull?: boolean;
26
+ clearToUndefined?: boolean;
26
27
  /**
27
28
  * @en Change the digital span. It can be decimal
28
29
  * @cn 改变数字跨度,可为小数
@@ -1 +1 @@
1
- {"version":3,"file":"use-input-number.type.d.ts","sourceRoot":"","sources":["use-input-number.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAC7D,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAClF,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"use-input-number.type.d.ts","sourceRoot":"","sources":["use-input-number.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAC7D,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAClF,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;;;yBA+CX,MAAM,UAAU,MAAM;;;;;;;CA+O5D,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;;;yBA+CX,MAAM,UAAU,MAAM;;;;;;;CA2R5D,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -180,7 +180,20 @@ var useTableLayout = function useTableLayout(props) {
180
180
  if (cols && cols.every(function (v) {
181
181
  return v === 0;
182
182
  })) return;
183
- setColgroup(shiftDecimalToLastColumn(cols));
183
+ var shifted = shiftDecimalToLastColumn(cols);
184
+ // 当 colgroup 中存在 undefined(说明从未被成功测量过),跳过相等判断,强制触发重新测量
185
+ // 场景:Table 在 display:none 容器中挂载时 getColgroup 测量失败,
186
+ // 后续 resetColGroup 产出值与初始值相同会被跳过,导致未设 width 的列永远无法获得实际宽度
187
+ var hasUndefined = shifted.some(function (v) {
188
+ return v === undefined;
189
+ });
190
+ // 值未变化时跳过,避免触发不必要的 useLayoutEffect
191
+ if (!hasUndefined && colgroup && shifted.length === colgroup.length && shifted.every(function (v, i) {
192
+ return v === colgroup[i];
193
+ })) {
194
+ return;
195
+ }
196
+ setColgroup(shifted);
184
197
  setAdjust(adjust);
185
198
  if (!adjust) {
186
199
  updateResizeFlag();
@@ -234,8 +247,7 @@ var useTableLayout = function useTableLayout(props) {
234
247
  var index = 0;
235
248
  var sum = 0;
236
249
  var _loop = function _loop() {
237
- var _items$i$getBoundingC = items[i].getBoundingClientRect(),
238
- width = _items$i$getBoundingC.width;
250
+ var width = items[i].offsetWidth;
239
251
  sum += width;
240
252
  var colspan = items[i].getAttribute('colspan');
241
253
  var colspanNum = parseInt(colspan || '1', 10);
@@ -363,6 +375,32 @@ var useTableLayout = function useTableLayout(props) {
363
375
  (_cancelFunc = cancelFunc) === null || _cancelFunc === void 0 || _cancelFunc();
364
376
  };
365
377
  }, [scrollRef.current]);
378
+
379
+ // 当祖先元素的 CSS 动画结束时(如 Modal 入场动画),重新测量列宽
380
+ // 解决 Table 在动画容器(如 Modal)中渲染时,动画期间测量的列宽不准确导致 sticky 表头与表体列宽错位的问题
381
+ (0, _react.useEffect)(function () {
382
+ var scrollEl = scrollRef.current;
383
+ if (!scrollEl) return;
384
+
385
+ // 查找最近的 fixed 定位祖先(如 Modal wrapper),仅在该元素上监听动画结束
386
+ var fixedAncestor = null;
387
+ var parent = scrollEl.parentElement;
388
+ while (parent) {
389
+ if (window.getComputedStyle(parent).position === 'fixed') {
390
+ fixedAncestor = parent;
391
+ break;
392
+ }
393
+ parent = parent.parentElement;
394
+ }
395
+ if (!fixedAncestor) return;
396
+ var handleAnimationEnd = function handleAnimationEnd() {
397
+ getColgroup(false);
398
+ };
399
+ fixedAncestor.addEventListener('animationend', handleAnimationEnd);
400
+ return function () {
401
+ fixedAncestor.removeEventListener('animationend', handleAnimationEnd);
402
+ };
403
+ }, [scrollRef.current]);
366
404
  (0, _react.useLayoutEffect)(function () {
367
405
  if (adjust) {
368
406
  getColgroup(adjust === 'drag');
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAI7C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AACnD,wBAAgB,YAAY,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE;IAE5D,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CAC/B,QAqCA;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAI7C,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AACnD,wBAAgB,YAAY,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE;IAE5D,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAE9B,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;CAC/B,QAsCA;AAED,eAAe,YAAY,CAAC"}
@@ -14,10 +14,13 @@ export function useClickAway(params) {
14
14
  });
15
15
  var target = Array.isArray(t) ? t : [t];
16
16
  var handleClickAway = usePersistFn(function (event) {
17
- // @ts-ignore
17
+ var _composedPath, _composedPath2, _ref;
18
+ // composedPath() 兼容 Shadow DOM,包含事件传播路径上的所有元素
19
+ var path = (_composedPath = (_composedPath2 = (_ref = event).composedPath) === null || _composedPath2 === void 0 ? void 0 : _composedPath2.call(_ref)) !== null && _composedPath !== void 0 ? _composedPath : [event.target];
18
20
  if (target.findIndex(function (t) {
19
- var _t$current;
20
- return (_t$current = t.current) === null || _t$current === void 0 ? void 0 : _t$current.contains(event.target);
21
+ return t.current && path.some(function (n) {
22
+ return n instanceof Node && t.current.contains(n);
23
+ });
21
24
  }) > -1) {
22
25
  return;
23
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-list-select-multiple.d.ts","sourceRoot":"","sources":["use-list-select-multiple.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMtE,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;sDA6MK;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;4BAjNzB,GAAG;;qCA6PqB,MAAM;;CAoC5D,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"use-list-select-multiple.d.ts","sourceRoot":"","sources":["use-list-select-multiple.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMtE,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;sDA6MK;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;4BAjNzB,GAAG;;qCAwQqB,MAAM;;CAoC5D,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -231,11 +231,22 @@ var useListSelectMultiple = function useListSelectMultiple(props) {
231
231
  for (var j = 0; j < raws.length; j++) {
232
232
  var _item2 = raws[j];
233
233
  if (props.prediction(values[_i], _item2)) {
234
+ if (props.keepCache) context.valueDataCache.set(values[_i], _item2);
234
235
  result.push(_item2);
235
236
  raws.splice(j, 1);
236
237
  continue outer;
237
238
  }
238
239
  }
240
+ // 当前 data 找不到,从 valueDataCache 中回退匹配
241
+ if (props.keepCache && context.valueDataCache) {
242
+ var cacheValues = Array.from(context.valueDataCache.values());
243
+ for (var k = 0; k < cacheValues.length; k++) {
244
+ if (props.prediction(values[_i], cacheValues[k])) {
245
+ result.push(cacheValues[k]);
246
+ continue outer;
247
+ }
248
+ }
249
+ }
239
250
  result.push({
240
251
  IS_NOT_MATCHED_VALUE: true,
241
252
  value: values[_i]
@@ -1 +1 @@
1
- {"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA4BtE,OAAO,EAEL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAM,OAAO;;;;;;;;;wBAuTC;gBAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAAC,WAAW,CAAC,EAAE,OAAO,CAAA;aAAE;8BArQnB,MAAM;oCAoVD,OAAO,aAAoB,MAAM,IAAI;;6BAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;oCAdrB,MAAM,EAAE;sCA/SxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;qCA+WvB,MAAM,WAAW,gBAAgB;gCA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;gCAKpC,MAAM,SAAS,MAAM;kCAzJpD,MAAM,0BAAyB,qBAAqB;;;;;;;;oBA+EjD;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;0BArQnB,MAAM;gCAoVD,OAAO,aAAoB,MAAM,IAAI;;yBAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;gCAdrB,MAAM,EAAE;kCA/SxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;iCA+WvB,MAAM,WAAW,gBAAgB;4BA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;4BAKpC,MAAM,SAAS,MAAM;8BAzJpD,MAAM,0BAAyB,qBAAqB;;;CA+b9D,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"use-form.d.ts","sourceRoot":"","sources":["use-form.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA6BtE,OAAO,EAEL,aAAa,EACb,YAAY,EACZ,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAe,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI5D,QAAA,MAAM,OAAO;;;;;;;;;wBAuTC;gBAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAAC,WAAW,CAAC,EAAE,OAAO,CAAA;aAAE;8BArQnB,MAAM;oCAsVD,OAAO,aAAoB,MAAM,IAAI;;6BAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;oCAdrB,MAAM,EAAE;sCAjTxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;qCAiXvB,MAAM,WAAW,gBAAgB;gCA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;gCAKpC,MAAM,SAAS,MAAM;kCA3JpD,MAAM,0BAAyB,qBAAqB;;;;;;;;oBA+EjD;YAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;0BArQnB,MAAM;gCAsVD,OAAO,aAAoB,MAAM,IAAI;;yBAf3C,MAAM,KAAK,KAAK,GAAG,SAAS;;gCAdrB,MAAM,EAAE;kCAjTxC,MAAM,GAAG,MAAM,EAAE,WAAU,gBAAgB;iCAiXvB,MAAM,WAAW,gBAAgB;4BA7CzB,MAAM,SAAS,MAAM,UAAU,KAAK;4BAKpC,MAAM,SAAS,MAAM;8BA3JpD,MAAM,0BAAyB,qBAAqB;;;CAic9D,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -17,6 +17,7 @@ import { usePrevious } from "../../common/use-default-value";
17
17
  import { SchemaBuilder } from "./use-form-schema/form-schema-builder";
18
18
  var globalKey = '__global__&&@@';
19
19
  var SUBMIT_TIMEOUT = 10;
20
+ var RESET_TIMEOUT = 500;
20
21
  import { current, produce } from "../../utils/immer";
21
22
  import { deepGet, deepRemove, deepSet, docScroll, extractEventHandlers, isArray, isObject, shallowEqual, wrapFormError, deepClone, getAllKeyPaths, getParentKeys, getCompleteFieldKeys, devUseWarning, getFieldId, getClosestScrollContainer } from "../../utils";
22
23
  var emptyObj = {};
@@ -315,6 +316,8 @@ var useForm = function useForm(props) {
315
316
  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
316
317
  validate: false
317
318
  };
319
+ // 重置保护期内(500ms),忽略子组件延迟 onChange 写回的旧值
320
+ if (context.resetTime && Date.now() - context.resetTime < RESET_TIMEOUT) return;
318
321
  onChange(function (draft) {
319
322
  var values = Object.keys(vals);
320
323
  // 针对 name 为数组模式,如 datepicker 的 name={['startTime', 'endTime']} 时,前者校验可能需要依赖后者,因此需要提前将后者数据整合至 draft 用于多字段整合校验
@@ -482,7 +485,7 @@ var useForm = function useForm(props) {
482
485
  onChange(getDefaultValue());
483
486
  clearValidate();
484
487
  update();
485
- context.resetTime = 1;
488
+ context.resetTime = Date.now();
486
489
  (_props$onReset = props.onReset) === null || _props$onReset === void 0 || _props$onReset.call(props);
487
490
  other === null || other === void 0 || (_other$onReset = other.onReset) === null || _other$onReset === void 0 || _other$onReset.call(other, e);
488
491
  };
@@ -3,6 +3,7 @@ import { InputNumberProps } from './use-input-number.type';
3
3
  declare const useNumberFormat: (props: InputNumberProps) => {
4
4
  onPlus: () => void;
5
5
  onMinus: () => void;
6
+ onClear: () => void;
6
7
  onChange: (v: string | undefined) => void;
7
8
  onBlur: (e: React.FocusEvent<HTMLInputElement, Element>) => void;
8
9
  onFocus: (e: React.FocusEvent<HTMLInputElement, Element>) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"use-input-number.d.ts","sourceRoot":"","sources":["use-input-number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,QAAA,MAAM,eAAe,UAAW,gBAAgB;;;;;;;;CA2L/C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"use-input-number.d.ts","sourceRoot":"","sources":["use-input-number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,QAAA,MAAM,eAAe,UAAW,gBAAgB;;;;;;;;;CAiM/C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -25,6 +25,7 @@ var useNumberFormat = function useNumberFormat(props) {
25
25
  min = props.min,
26
26
  max = props.max,
27
27
  allowNull = props.allowNull,
28
+ clearToUndefined = props.clearToUndefined,
28
29
  _props$step = props.step,
29
30
  step = _props$step === void 0 ? 1 : _props$step,
30
31
  cancelBlurChange = props.cancelBlurChange,
@@ -45,10 +46,9 @@ var useNumberFormat = function useNumberFormat(props) {
45
46
  setInternalInputValue = _React$useState2[1];
46
47
  var focusedRef = React.useRef(false);
47
48
  useEffect(function () {
48
- // 聚焦编辑期间不同步外部值,避免 form 回填 defaultValue 覆盖用户输入
49
- // 但当外部值被清空时( clearable 触发),即使聚焦也需要同步
50
- if (props.value !== inernalInputValue && (!focusedRef.current || props.value == null || props.value === '')) {
51
- setInternalInputValue(getStringValue(props.value));
49
+ var stringValue = getStringValue(props.value);
50
+ if (stringValue !== inernalInputValue && (!focusedRef.current || props.value == null)) {
51
+ setInternalInputValue(stringValue);
52
52
  }
53
53
  }, [props.value]);
54
54
  var getNumberValue = function getNumberValue(value) {
@@ -174,6 +174,10 @@ var useNumberFormat = function useNumberFormat(props) {
174
174
  var num = changeValue(-step);
175
175
  if (num !== undefined) setInternalInputValue(getStringValue(num));
176
176
  });
177
+ var handleClear = usePersistFn(function () {
178
+ setInternalInputValue('');
179
+ onChange === null || onChange === void 0 || onChange(clearToUndefined ? undefined : allowNull ? null : '');
180
+ });
177
181
  return _objectSpread(_objectSpread({}, useInputFormat({
178
182
  value: inernalInputValue,
179
183
  type: 'number',
@@ -187,7 +191,8 @@ var useNumberFormat = function useNumberFormat(props) {
187
191
  cancelBlurChange: true
188
192
  })), {}, {
189
193
  onPlus: handlePlus,
190
- onMinus: handleMinus
194
+ onMinus: handleMinus,
195
+ onClear: handleClear
191
196
  });
192
197
  };
193
198
  export default useNumberFormat;
@@ -23,6 +23,7 @@ export interface InputNumberProps extends Omit<InputFormatProps, 'value' | 'onCh
23
23
  * @cn 清空后值为 null
24
24
  */
25
25
  allowNull?: boolean;
26
+ clearToUndefined?: boolean;
26
27
  /**
27
28
  * @en Change the digital span. It can be decimal
28
29
  * @cn 改变数字跨度,可为小数
@@ -1 +1 @@
1
- {"version":3,"file":"use-input-number.type.d.ts","sourceRoot":"","sources":["use-input-number.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAC7D,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAClF,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"use-input-number.type.d.ts","sourceRoot":"","sources":["use-input-number.type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAC7D,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAClF,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,SAAS,CAAC;IACnD;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;;;yBA+CX,MAAM,UAAU,MAAM;;;;;;;CA+O5D,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;;;yBA+CX,MAAM,UAAU,MAAM;;;;;;;CA2R5D,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -171,7 +171,20 @@ var useTableLayout = function useTableLayout(props) {
171
171
  if (cols && cols.every(function (v) {
172
172
  return v === 0;
173
173
  })) return;
174
- setColgroup(shiftDecimalToLastColumn(cols));
174
+ var shifted = shiftDecimalToLastColumn(cols);
175
+ // 当 colgroup 中存在 undefined(说明从未被成功测量过),跳过相等判断,强制触发重新测量
176
+ // 场景:Table 在 display:none 容器中挂载时 getColgroup 测量失败,
177
+ // 后续 resetColGroup 产出值与初始值相同会被跳过,导致未设 width 的列永远无法获得实际宽度
178
+ var hasUndefined = shifted.some(function (v) {
179
+ return v === undefined;
180
+ });
181
+ // 值未变化时跳过,避免触发不必要的 useLayoutEffect
182
+ if (!hasUndefined && colgroup && shifted.length === colgroup.length && shifted.every(function (v, i) {
183
+ return v === colgroup[i];
184
+ })) {
185
+ return;
186
+ }
187
+ setColgroup(shifted);
175
188
  setAdjust(adjust);
176
189
  if (!adjust) {
177
190
  updateResizeFlag();
@@ -225,8 +238,7 @@ var useTableLayout = function useTableLayout(props) {
225
238
  var index = 0;
226
239
  var sum = 0;
227
240
  var _loop = function _loop() {
228
- var _items$i$getBoundingC = items[i].getBoundingClientRect(),
229
- width = _items$i$getBoundingC.width;
241
+ var width = items[i].offsetWidth;
230
242
  sum += width;
231
243
  var colspan = items[i].getAttribute('colspan');
232
244
  var colspanNum = parseInt(colspan || '1', 10);
@@ -354,6 +366,32 @@ var useTableLayout = function useTableLayout(props) {
354
366
  (_cancelFunc = cancelFunc) === null || _cancelFunc === void 0 || _cancelFunc();
355
367
  };
356
368
  }, [scrollRef.current]);
369
+
370
+ // 当祖先元素的 CSS 动画结束时(如 Modal 入场动画),重新测量列宽
371
+ // 解决 Table 在动画容器(如 Modal)中渲染时,动画期间测量的列宽不准确导致 sticky 表头与表体列宽错位的问题
372
+ useEffect(function () {
373
+ var scrollEl = scrollRef.current;
374
+ if (!scrollEl) return;
375
+
376
+ // 查找最近的 fixed 定位祖先(如 Modal wrapper),仅在该元素上监听动画结束
377
+ var fixedAncestor = null;
378
+ var parent = scrollEl.parentElement;
379
+ while (parent) {
380
+ if (window.getComputedStyle(parent).position === 'fixed') {
381
+ fixedAncestor = parent;
382
+ break;
383
+ }
384
+ parent = parent.parentElement;
385
+ }
386
+ if (!fixedAncestor) return;
387
+ var handleAnimationEnd = function handleAnimationEnd() {
388
+ getColgroup(false);
389
+ };
390
+ fixedAncestor.addEventListener('animationend', handleAnimationEnd);
391
+ return function () {
392
+ fixedAncestor.removeEventListener('animationend', handleAnimationEnd);
393
+ };
394
+ }, [scrollRef.current]);
357
395
  useLayoutEffect(function () {
358
396
  if (adjust) {
359
397
  getColgroup(adjust === 'drag');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sheinx/hooks",
3
- "version": "3.9.13",
3
+ "version": "3.9.14-beta.10",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",