@zat-design/sisyphus-react 4.0.0-beta.7 → 4.0.0-beta.8

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.
@@ -23,6 +23,7 @@ import { isSelect, isTrim } from "../../../ProForm/utils";
23
23
  import ConfirmWrapper from "../../../ProForm/components/render/ConfirmWrapper";
24
24
  import { getDefaultProps } from "../../utils/getDefaultProps";
25
25
  import ListChangedWrapper from "./ListChangedWrapper";
26
+ import useShouldUpdateForTable from "../../utils/useShouldUpdateForTable";
26
27
  import { Fragment as _Fragment } from "react/jsx-runtime";
27
28
  import { jsx as _jsx } from "react/jsx-runtime";
28
29
  var RenderField = _ref => {
@@ -58,8 +59,6 @@ var RenderField = _ref => {
58
59
  dependencies = column.dependencies,
59
60
  desensitization = column.desensitization,
60
61
  resetProps = _objectWithoutProperties(column, _excluded);
61
- // editRender弃用使用component同ProForm
62
- var _editRender = component || editRender;
63
62
  var mode = config.mode,
64
63
  cellName = config.cellName,
65
64
  cellNamePath = config.cellNamePath,
@@ -76,13 +75,17 @@ var RenderField = _ref => {
76
75
  validateTrigger = _config$validateTrigg === void 0 ? ['onChange', 'onBlur', 'onSubmit'] : _config$validateTrigg,
77
76
  otherProps = config.otherProps,
78
77
  diffConfig = config.diffConfig,
79
- getIsNew = config.getIsNew;
78
+ getIsNew = config.getIsNew,
79
+ shouldUpdateDebounce = config.shouldUpdateDebounce;
80
80
  var _fieldProps = fieldProps || formItemProps || {};
81
81
  var _rules = rules || [];
82
82
  var _required = required;
83
83
  var _valueType = valueType;
84
84
  var _disabled = false;
85
85
  var _desensitization = desensitization || [];
86
+
87
+ // editRender弃用使用component同ProForm
88
+ var _editRender = component || editRender;
86
89
  var isCell = mode === 'cell';
87
90
  if (isCell) {
88
91
  record['is-view'] = !isEqual(cellNamePath, cellName);
@@ -112,21 +115,34 @@ var RenderField = _ref => {
112
115
  // 行参数 - 使用useMemo优化
113
116
  var rowParams = useMemo(() => [currentValue, rowData, options], [currentValue, rowData, options]);
114
117
 
118
+ // 使用 hook 处理动态属性(带选择性防抖)
119
+ var dynamicProps = useShouldUpdateForTable({
120
+ rowParams,
121
+ column,
122
+ shouldUpdateDebounce
123
+ });
124
+
115
125
  // required & rules & fieldProps & disabled & valueType 函数化处理
126
+ // 优先使用 hook 返回的值,fallback 到原始值
116
127
  if (isFunction(required)) {
117
- _required = required(...rowParams);
128
+ var _dynamicProps$require;
129
+ _required = (_dynamicProps$require = dynamicProps.required) !== null && _dynamicProps$require !== void 0 ? _dynamicProps$require : required(...rowParams);
118
130
  }
119
131
  if (isFunction(fieldProps)) {
120
- _fieldProps = fieldProps(...rowParams);
132
+ var _dynamicProps$fieldPr;
133
+ _fieldProps = (_dynamicProps$fieldPr = dynamicProps.fieldProps) !== null && _dynamicProps$fieldPr !== void 0 ? _dynamicProps$fieldPr : fieldProps(...rowParams);
121
134
  }
122
135
  if (isFunction(rules)) {
123
- _rules = rules(...rowParams);
136
+ var _dynamicProps$rules;
137
+ _rules = (_dynamicProps$rules = dynamicProps.rules) !== null && _dynamicProps$rules !== void 0 ? _dynamicProps$rules : rules(...rowParams);
124
138
  }
125
139
  if (isFunction(valueType)) {
126
- _valueType = valueType(...rowParams);
140
+ var _dynamicProps$valueTy;
141
+ _valueType = (_dynamicProps$valueTy = dynamicProps.valueType) !== null && _dynamicProps$valueTy !== void 0 ? _dynamicProps$valueTy : valueType(...rowParams);
127
142
  }
128
143
  if (isFunction(desensitization)) {
129
- _desensitization = desensitization(...rowParams);
144
+ var _dynamicProps$desensi;
145
+ _desensitization = (_dynamicProps$desensi = dynamicProps.desensitization) !== null && _dynamicProps$desensi !== void 0 ? _dynamicProps$desensi : desensitization(...rowParams);
130
146
  }
131
147
 
132
148
  // 获取最终的disabled
@@ -138,8 +154,11 @@ var RenderField = _ref => {
138
154
  columnFieldProps: _fieldProps,
139
155
  params: rowParams
140
156
  });
157
+
158
+ // isEditable 处理 - 优先使用 hook 返回的值
141
159
  if (isFunction(isEditable)) {
142
- isEditable = isEditable(...rowParams);
160
+ var _dynamicProps$isEdita;
161
+ isEditable = (_dynamicProps$isEdita = dynamicProps.isEditable) !== null && _dynamicProps$isEdita !== void 0 ? _dynamicProps$isEdita : isEditable(...rowParams);
143
162
  }
144
163
 
145
164
  // 是否只读文本
@@ -756,5 +775,21 @@ export default /*#__PURE__*/memo(RenderField, (prevProps, nextProps) => {
756
775
  return false;
757
776
  }
758
777
  }
778
+
779
+ // 特殊处理:当使用自定义 component 函数时,比较整个 record 对象
780
+ // 因为自定义组件可能依赖 record 中的其他字段(不只是当前列的 dataIndex)
781
+ if (isFunction(prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn.component) || isFunction(nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn.component)) {
782
+ // 浅比较 record 的所有属性
783
+ var prevKeys = Object.keys(prevRecord || {});
784
+ var nextKeys = Object.keys(nextRecord || {});
785
+ if (prevKeys.length !== nextKeys.length) {
786
+ return false;
787
+ }
788
+
789
+ // 使用 some 方法代替 for 循环
790
+ if (prevKeys.some(key => (prevRecord === null || prevRecord === void 0 ? void 0 : prevRecord[key]) !== (nextRecord === null || nextRecord === void 0 ? void 0 : nextRecord[key]))) {
791
+ return false;
792
+ }
793
+ }
759
794
  return true;
760
795
  });
@@ -20,7 +20,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
20
20
  import { Fragment as _Fragment } from "react/jsx-runtime";
21
21
  import { jsxs as _jsxs } from "react/jsx-runtime";
22
22
  var ProEditTable = (_ref, ref) => {
23
- var _resetProps$id, _resetProps$id$split, _themeConfig$data2, _resetProps$otherProp;
23
+ var _resetProps$id, _resetProps$id$split, _ref2, _formFieldProps$shoul, _themeConfig$data2, _resetProps$otherProp;
24
24
  var _ref$value = _ref.value,
25
25
  value = _ref$value === void 0 ? [] : _ref$value,
26
26
  onChange = _ref.onChange,
@@ -73,6 +73,7 @@ var ProEditTable = (_ref, ref) => {
73
73
  var affixRef = useRef(null);
74
74
  var form = contentForm || (formFieldProps === null || formFieldProps === void 0 ? void 0 : formFieldProps.form) || (resetProps === null || resetProps === void 0 ? void 0 : resetProps.form);
75
75
  var name = (formFieldProps === null || formFieldProps === void 0 ? void 0 : formFieldProps.name) || (resetProps === null || resetProps === void 0 ? void 0 : resetProps.name) || (resetProps === null || resetProps === void 0 || (_resetProps$id = resetProps.id) === null || _resetProps$id === void 0 || (_resetProps$id$split = _resetProps$id.split) === null || _resetProps$id$split === void 0 ? void 0 : _resetProps$id$split.call(_resetProps$id, '_'));
76
+ var shouldUpdateDebounce = (_ref2 = (_formFieldProps$shoul = formFieldProps === null || formFieldProps === void 0 ? void 0 : formFieldProps.shouldUpdateDebounce) !== null && _formFieldProps$shoul !== void 0 ? _formFieldProps$shoul : resetProps === null || resetProps === void 0 ? void 0 : resetProps.shouldUpdateDebounce) !== null && _ref2 !== void 0 ? _ref2 : 200;
76
77
  var _formFieldProps$isVie = formFieldProps.isView,
77
78
  isView = _formFieldProps$isVie === void 0 ? false : _formFieldProps$isVie,
78
79
  _formFieldProps$viewE = formFieldProps.viewEmpty,
@@ -95,8 +96,8 @@ var ProEditTable = (_ref, ref) => {
95
96
  _useLocalStorageState2 = _slicedToArray(_useLocalStorageState, 1),
96
97
  themeConfig = _useLocalStorageState2[0];
97
98
  var requiredAlign = useMemo(() => {
98
- var _ref2, _themeConfig$data$zau, _themeConfig$data;
99
- return (_ref2 = (_themeConfig$data$zau = themeConfig === null || themeConfig === void 0 || (_themeConfig$data = themeConfig.data) === null || _themeConfig$data === void 0 ? void 0 : _themeConfig$data.zauiFormAlign) !== null && _themeConfig$data$zau !== void 0 ? _themeConfig$data$zau : configRequiredAlign) !== null && _ref2 !== void 0 ? _ref2 : 'left';
99
+ var _ref3, _themeConfig$data$zau, _themeConfig$data;
100
+ return (_ref3 = (_themeConfig$data$zau = themeConfig === null || themeConfig === void 0 || (_themeConfig$data = themeConfig.data) === null || _themeConfig$data === void 0 ? void 0 : _themeConfig$data.zauiFormAlign) !== null && _themeConfig$data$zau !== void 0 ? _themeConfig$data$zau : configRequiredAlign) !== null && _ref3 !== void 0 ? _ref3 : 'left';
100
101
  }, [themeConfig === null || themeConfig === void 0 || (_themeConfig$data2 = themeConfig.data) === null || _themeConfig$data2 === void 0 ? void 0 : _themeConfig$data2.zauiFormAlign, configRequiredAlign]);
101
102
  var _useSetState = useSetState({
102
103
  cellNamePath: [],
@@ -138,8 +139,8 @@ var ProEditTable = (_ref, ref) => {
138
139
  var getRowKey = useCallback(record => {
139
140
  var key = record.rowKey || getRandom();
140
141
  if (rowKey) {
141
- var _ref3;
142
- key = (_ref3 = isFunction(rowKey) ? rowKey(record) : record[rowKey]) !== null && _ref3 !== void 0 ? _ref3 : key;
142
+ var _ref4;
143
+ key = (_ref4 = isFunction(rowKey) ? rowKey(record) : record[rowKey]) !== null && _ref4 !== void 0 ? _ref4 : key;
143
144
  }
144
145
  return key;
145
146
  }, [rowKey]);
@@ -174,7 +175,7 @@ var ProEditTable = (_ref, ref) => {
174
175
 
175
176
  // 分页变更
176
177
  var handlePageChange = useCallback( /*#__PURE__*/function () {
177
- var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(current, pageSize) {
178
+ var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(current, pageSize) {
178
179
  return _regeneratorRuntime().wrap(function _callee$(_context) {
179
180
  while (1) switch (_context.prev = _context.next) {
180
181
  case 0:
@@ -220,7 +221,7 @@ var ProEditTable = (_ref, ref) => {
220
221
  }, _callee, null, [[0, 10]]);
221
222
  }));
222
223
  return function (_x, _x2) {
223
- return _ref4.apply(this, arguments);
224
+ return _ref5.apply(this, arguments);
224
225
  };
225
226
  }(), [pagination, page.pageSize, form, name]);
226
227
  var config = _objectSpread({
@@ -257,6 +258,7 @@ var ProEditTable = (_ref, ref) => {
257
258
  rowDisabled,
258
259
  actionDirection,
259
260
  diffConfig: _objectSpread(_objectSpread({}, resetProps === null || resetProps === void 0 || (_resetProps$otherProp = resetProps.otherProps) === null || _resetProps$otherProp === void 0 ? void 0 : _resetProps$otherProp.diffConfig), diffConfig),
261
+ shouldUpdateDebounce,
260
262
  getIsNew,
261
263
  handlePageChange
262
264
  }, resetProps);
@@ -317,7 +319,7 @@ var ProEditTable = (_ref, ref) => {
317
319
 
318
320
  // 空列表状态
319
321
  var emptyDom = useMemo(() => () => {
320
- var _filter, _ref5;
322
+ var _filter, _ref6;
321
323
  return /*#__PURE__*/_jsxs("div", {
322
324
  className: "com-empty",
323
325
  children: [/*#__PURE__*/_jsx("img", {
@@ -328,7 +330,7 @@ var ProEditTable = (_ref, ref) => {
328
330
  className: "content",
329
331
  children: disabled || isForbiddenBtn('add') ? locale.ProEditTable.noData : /*#__PURE__*/_jsxs(_Fragment, {
330
332
  children: [locale.ProEditTable.noData, "\uFF0C", /*#__PURE__*/_jsx(RenderToolbar, _objectSpread({}, _objectSpread(_objectSpread({}, config), {}, {
331
- toolbarProps: toolbarProps === null || toolbarProps === void 0 || (_filter = (_ref5 = toolbarProps).filter) === null || _filter === void 0 ? void 0 : _filter.call(_ref5, item => item.type === 'add' || (item === null || item === void 0 ? void 0 : item.persistence)),
333
+ toolbarProps: toolbarProps === null || toolbarProps === void 0 || (_filter = (_ref6 = toolbarProps).filter) === null || _filter === void 0 ? void 0 : _filter.call(_ref6, item => item.type === 'add' || (item === null || item === void 0 ? void 0 : item.persistence)),
332
334
  dataSource: []
333
335
  })))]
334
336
  })
@@ -402,6 +402,12 @@ export interface ProEditTableProps<T = any> extends Omit<TableProps<T>, 'onChang
402
402
  /** 是否跟随父元素滚动 */
403
403
  scrollFollowParent?: boolean;
404
404
  };
405
+ /**
406
+ * 动态属性更新防抖时间(毫秒)
407
+ * 用于优化表格编辑时的性能,对 fieldProps、desensitization, required、rules、isEditable, valueType 等属性进行防抖处理, 当设置为 0 时禁用防抖,所有属性立即响应
408
+ * @default 200
409
+ */
410
+ shouldUpdateDebounce?: number;
405
411
  }
406
412
  /**
407
413
  * 基础操作按钮类型(基于接口)
@@ -0,0 +1,15 @@
1
+ interface UseShouldUpdateForTableProps {
2
+ rowParams: any[];
3
+ column: any;
4
+ shouldUpdateDebounce: number;
5
+ }
6
+ interface Result {
7
+ isEditable: any;
8
+ required: any;
9
+ rules: any;
10
+ fieldProps: any;
11
+ desensitization: any;
12
+ valueType: any;
13
+ }
14
+ declare const useShouldUpdateForTable: (props: UseShouldUpdateForTableProps) => Result;
15
+ export default useShouldUpdateForTable;
@@ -0,0 +1,132 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useRef, useState, useEffect } from 'react';
3
+ import { isFunction, isEqualWith, debounce } from 'lodash';
4
+ import { customEqualForFunction } from "../../utils";
5
+ var useShouldUpdateForTable = props => {
6
+ var _isEditableRef$curren, _requiredRef$current, _rulesRef$current, _fieldPropsRef$curren, _desensitizationRef$c, _valueTypeRef$current;
7
+ var rowParams = props.rowParams,
8
+ column = props.column,
9
+ shouldUpdateDebounce = props.shouldUpdateDebounce;
10
+
11
+ // refs 存储当前值
12
+ var isEditableRef = useRef();
13
+ var requiredRef = useRef();
14
+ var rulesRef = useRef();
15
+ var fieldPropsRef = useRef();
16
+ var desensitizationRef = useRef();
17
+ var valueTypeRef = useRef();
18
+ var _useState = useState({}),
19
+ _useState2 = _slicedToArray(_useState, 2),
20
+ reRender = _useState2[1];
21
+ var debouncedUpdateRef = useRef(null);
22
+ var pendingParamsRef = useRef(null);
23
+
24
+ // 统一处理所有动态属性的更新
25
+ var processUpdate = params => {
26
+ var hasChange = false;
27
+
28
+ // isEditable 处理
29
+ if (isFunction(column.isEditable)) {
30
+ var newIsEditable = column.isEditable(...params);
31
+ if (isEditableRef.current !== newIsEditable) {
32
+ isEditableRef.current = newIsEditable;
33
+ hasChange = true;
34
+ }
35
+ } else {
36
+ isEditableRef.current = column.isEditable;
37
+ }
38
+
39
+ // required 处理
40
+ if (isFunction(column.required)) {
41
+ var newRequired = column.required(...params);
42
+ if (requiredRef.current !== newRequired) {
43
+ requiredRef.current = newRequired;
44
+ hasChange = true;
45
+ }
46
+ } else {
47
+ requiredRef.current = column.required;
48
+ }
49
+
50
+ // rules 处理
51
+ if (isFunction(column.rules)) {
52
+ var newRules = column.rules(...params);
53
+ if (!isEqualWith(rulesRef.current, newRules, customEqualForFunction)) {
54
+ rulesRef.current = newRules;
55
+ hasChange = true;
56
+ }
57
+ } else {
58
+ rulesRef.current = column.rules;
59
+ }
60
+
61
+ // fieldProps 处理
62
+ if (isFunction(column.fieldProps)) {
63
+ var newFieldProps = column.fieldProps(...params);
64
+ if (!isEqualWith(fieldPropsRef.current, newFieldProps, customEqualForFunction)) {
65
+ fieldPropsRef.current = newFieldProps;
66
+ hasChange = true;
67
+ }
68
+ } else {
69
+ fieldPropsRef.current = column.fieldProps;
70
+ }
71
+
72
+ // desensitization 处理
73
+ if (isFunction(column.desensitization)) {
74
+ var newDesensitization = column.desensitization(...params);
75
+ if (!isEqualWith(desensitizationRef.current, newDesensitization)) {
76
+ desensitizationRef.current = newDesensitization;
77
+ hasChange = true;
78
+ }
79
+ } else {
80
+ desensitizationRef.current = column.desensitization;
81
+ }
82
+
83
+ // valueType 处理
84
+ if (isFunction(column.valueType)) {
85
+ var newValueType = column.valueType(...params);
86
+ if (valueTypeRef.current !== newValueType) {
87
+ valueTypeRef.current = newValueType;
88
+ hasChange = true;
89
+ }
90
+ } else {
91
+ valueTypeRef.current = column.valueType;
92
+ }
93
+ if (hasChange) {
94
+ reRender({});
95
+ }
96
+ };
97
+
98
+ // 创建防抖函数(统一处理所有动态属性)
99
+ useEffect(() => {
100
+ if (shouldUpdateDebounce > 0 && (isFunction(column.isEditable) || isFunction(column.required) || isFunction(column.rules) || isFunction(column.fieldProps) || isFunction(column.desensitization) || isFunction(column.valueType))) {
101
+ debouncedUpdateRef.current = debounce(() => {
102
+ if (pendingParamsRef.current) {
103
+ processUpdate(pendingParamsRef.current);
104
+ pendingParamsRef.current = null;
105
+ }
106
+ }, shouldUpdateDebounce);
107
+ }
108
+ return () => {
109
+ var _debouncedUpdateRef$c;
110
+ (_debouncedUpdateRef$c = debouncedUpdateRef.current) === null || _debouncedUpdateRef$c === void 0 || _debouncedUpdateRef$c.cancel();
111
+ };
112
+ }, [shouldUpdateDebounce, column]);
113
+
114
+ // 统一的属性处理逻辑
115
+ if (shouldUpdateDebounce > 0 && debouncedUpdateRef.current) {
116
+ // 使用防抖延迟更新
117
+ pendingParamsRef.current = rowParams;
118
+ debouncedUpdateRef.current();
119
+ } else {
120
+ // 立即更新(shouldUpdateDebounce = 0 或无防抖函数)
121
+ processUpdate(rowParams);
122
+ }
123
+ return {
124
+ isEditable: (_isEditableRef$curren = isEditableRef.current) !== null && _isEditableRef$curren !== void 0 ? _isEditableRef$curren : column.isEditable,
125
+ required: (_requiredRef$current = requiredRef.current) !== null && _requiredRef$current !== void 0 ? _requiredRef$current : column.required,
126
+ rules: (_rulesRef$current = rulesRef.current) !== null && _rulesRef$current !== void 0 ? _rulesRef$current : column.rules,
127
+ fieldProps: (_fieldPropsRef$curren = fieldPropsRef.current) !== null && _fieldPropsRef$curren !== void 0 ? _fieldPropsRef$curren : column.fieldProps,
128
+ desensitization: (_desensitizationRef$c = desensitizationRef.current) !== null && _desensitizationRef$c !== void 0 ? _desensitizationRef$c : column.desensitization,
129
+ valueType: (_valueTypeRef$current = valueTypeRef.current) !== null && _valueTypeRef$current !== void 0 ? _valueTypeRef$current : column.valueType
130
+ };
131
+ };
132
+ export default useShouldUpdateForTable;
@@ -209,7 +209,8 @@ var RenderFields = props => {
209
209
  listName: column.listName,
210
210
  globalControl,
211
211
  formDisabled,
212
- diffConfig
212
+ diffConfig,
213
+ shouldUpdateDebounce
213
214
  };
214
215
  return /*#__PURE__*/_jsx(FieldProvider, {
215
216
  value: otherProps,
@@ -66,7 +66,7 @@ var ProForm = (props, ref) => {
66
66
  _props$stopOnFirstErr = props.stopOnFirstError,
67
67
  stopOnFirstError = _props$stopOnFirstErr === void 0 ? false : _props$stopOnFirstErr,
68
68
  _props$shouldUpdateDe = props.shouldUpdateDebounce,
69
- shouldUpdateDebounce = _props$shouldUpdateDe === void 0 ? 500 : _props$shouldUpdateDe,
69
+ shouldUpdateDebounce = _props$shouldUpdateDe === void 0 ? 200 : _props$shouldUpdateDe,
70
70
  otherProps = _objectWithoutProperties(props, _excluded);
71
71
  var config = useProConfig('ProForm');
72
72
  // source: 用于区分是哪个组件调用,用于错误提示
@@ -46,6 +46,7 @@ export interface ProFormOtherType {
46
46
  formDisabled?: boolean;
47
47
  isDiffChange?: boolean;
48
48
  diffConfig?: DiffConfigType;
49
+ shouldUpdateDebounce?: number;
49
50
  }
50
51
  export interface DiffConfigType<Values = any> {
51
52
  /** 比对原始数据源 */
@@ -24,8 +24,7 @@ var useShouldUpdate = props => {
24
24
  originComponent = props.originComponent,
25
25
  type = props.type,
26
26
  desensitization = props.desensitization,
27
- _props$shouldUpdateDe = props.shouldUpdateDebounce,
28
- shouldUpdateDebounce = _props$shouldUpdateDe === void 0 ? 500 : _props$shouldUpdateDe;
27
+ shouldUpdateDebounce = props.shouldUpdateDebounce;
29
28
  var _shouldUpdate = formItemProps.shouldUpdate,
30
29
  name = formItemProps.name,
31
30
  clearNotShow = formItemProps.clearNotShow,
@@ -6,6 +6,9 @@
6
6
  .pro-tabs-card-left {
7
7
  width: 84px !important;
8
8
  }
9
+ .pro-tabs-card-right {
10
+ width: 24px !important;
11
+ }
9
12
  .pro-tabs-card-right img {
10
13
  width: 24px !important;
11
14
  }
@@ -94,7 +97,7 @@
94
97
 
95
98
  .pro-tabs-card-right {
96
99
  display: flex;
97
-
100
+ width: 48px;
98
101
  img {
99
102
  width: 48px;
100
103
  }
@@ -123,6 +126,7 @@
123
126
  width: 200px;
124
127
  padding: calc(9px * var(--zaui-size; 1)) 16px calc(9px * var(--zaui-size; 1)) 24px;
125
128
  border: 1px solid var(--zaui-line, #dddddd);
129
+ border-radius: var(--zaui-border-radius, 8px);
126
130
 
127
131
  .pro-tabs-card-left {
128
132
  width: 104px;
package/es/utils/index.js CHANGED
@@ -4,10 +4,22 @@ import { isFunction } from 'lodash';
4
4
  var EMPTY_VALUE = [undefined, null, ''];
5
5
 
6
6
  // 自定义深比对 如果两边都是函数类型则认为相等
7
+ // 对于 React 元素,不直接认为相等,而是让 lodash 继续进行深度比较
7
8
  export var customEqualForFunction = (value, other) => {
8
- if (isFunction(value) && isFunction(other) || /*#__PURE__*/React.isValidElement(value) && /*#__PURE__*/React.isValidElement(other)) {
9
+ // 只有当两边都是函数时才认为相等
10
+ if (isFunction(value) && isFunction(other)) {
9
11
  return true;
10
12
  }
13
+ // 对于 React 元素,返回 undefined 让 isEqualWith 继续使用默认比较逻辑
14
+ // 这样会比较 React 元素的 type、props 等属性
15
+ if ( /*#__PURE__*/React.isValidElement(value) && /*#__PURE__*/React.isValidElement(other)) {
16
+ // 比较 React 元素的类型和关键 props
17
+ if (value.type !== other.type) {
18
+ return false;
19
+ }
20
+ // 对于相同类型的 React 元素,返回 undefined 让 isEqualWith 继续深度比较 props
21
+ return undefined;
22
+ }
11
23
  };
12
24
 
13
25
  /**
@@ -28,6 +28,7 @@ var _utils2 = require("../../../ProForm/utils");
28
28
  var _ConfirmWrapper = _interopRequireDefault(require("../../../ProForm/components/render/ConfirmWrapper"));
29
29
  var _getDefaultProps = require("../../utils/getDefaultProps");
30
30
  var _ListChangedWrapper = _interopRequireDefault(require("./ListChangedWrapper"));
31
+ var _useShouldUpdateForTable = _interopRequireDefault(require("../../utils/useShouldUpdateForTable"));
31
32
  var _jsxRuntime = require("react/jsx-runtime");
32
33
  var _excluded = ["type", "valueType", "names", "fieldProps", "labelRequired", "editRender", "component", "viewRender", "title", "originTitle", "label", "dataIndex", "formItemProps", "isEditable", "required", "rules", "onDiff", "className", "trim", "confirm", "dependencies", "desensitization"];
33
34
  /* eslint-disable prefer-destructuring */
@@ -65,8 +66,6 @@ var RenderField = _ref => {
65
66
  dependencies = column.dependencies,
66
67
  desensitization = column.desensitization,
67
68
  resetProps = (0, _objectWithoutProperties2.default)(column, _excluded);
68
- // editRender弃用使用component同ProForm
69
- var _editRender = component || editRender;
70
69
  var mode = config.mode,
71
70
  cellName = config.cellName,
72
71
  cellNamePath = config.cellNamePath,
@@ -83,13 +82,17 @@ var RenderField = _ref => {
83
82
  validateTrigger = _config$validateTrigg === void 0 ? ['onChange', 'onBlur', 'onSubmit'] : _config$validateTrigg,
84
83
  otherProps = config.otherProps,
85
84
  diffConfig = config.diffConfig,
86
- getIsNew = config.getIsNew;
85
+ getIsNew = config.getIsNew,
86
+ shouldUpdateDebounce = config.shouldUpdateDebounce;
87
87
  var _fieldProps = fieldProps || formItemProps || {};
88
88
  var _rules = rules || [];
89
89
  var _required = required;
90
90
  var _valueType = valueType;
91
91
  var _disabled = false;
92
92
  var _desensitization = desensitization || [];
93
+
94
+ // editRender弃用使用component同ProForm
95
+ var _editRender = component || editRender;
93
96
  var isCell = mode === 'cell';
94
97
  if (isCell) {
95
98
  record['is-view'] = !(0, _lodash.isEqual)(cellNamePath, cellName);
@@ -119,21 +122,34 @@ var RenderField = _ref => {
119
122
  // 行参数 - 使用useMemo优化
120
123
  var rowParams = (0, _react.useMemo)(() => [currentValue, rowData, options], [currentValue, rowData, options]);
121
124
 
125
+ // 使用 hook 处理动态属性(带选择性防抖)
126
+ var dynamicProps = (0, _useShouldUpdateForTable.default)({
127
+ rowParams,
128
+ column,
129
+ shouldUpdateDebounce
130
+ });
131
+
122
132
  // required & rules & fieldProps & disabled & valueType 函数化处理
133
+ // 优先使用 hook 返回的值,fallback 到原始值
123
134
  if ((0, _lodash.isFunction)(required)) {
124
- _required = required(...rowParams);
135
+ var _dynamicProps$require;
136
+ _required = (_dynamicProps$require = dynamicProps.required) !== null && _dynamicProps$require !== void 0 ? _dynamicProps$require : required(...rowParams);
125
137
  }
126
138
  if ((0, _lodash.isFunction)(fieldProps)) {
127
- _fieldProps = fieldProps(...rowParams);
139
+ var _dynamicProps$fieldPr;
140
+ _fieldProps = (_dynamicProps$fieldPr = dynamicProps.fieldProps) !== null && _dynamicProps$fieldPr !== void 0 ? _dynamicProps$fieldPr : fieldProps(...rowParams);
128
141
  }
129
142
  if ((0, _lodash.isFunction)(rules)) {
130
- _rules = rules(...rowParams);
143
+ var _dynamicProps$rules;
144
+ _rules = (_dynamicProps$rules = dynamicProps.rules) !== null && _dynamicProps$rules !== void 0 ? _dynamicProps$rules : rules(...rowParams);
131
145
  }
132
146
  if ((0, _lodash.isFunction)(valueType)) {
133
- _valueType = valueType(...rowParams);
147
+ var _dynamicProps$valueTy;
148
+ _valueType = (_dynamicProps$valueTy = dynamicProps.valueType) !== null && _dynamicProps$valueTy !== void 0 ? _dynamicProps$valueTy : valueType(...rowParams);
134
149
  }
135
150
  if ((0, _lodash.isFunction)(desensitization)) {
136
- _desensitization = desensitization(...rowParams);
151
+ var _dynamicProps$desensi;
152
+ _desensitization = (_dynamicProps$desensi = dynamicProps.desensitization) !== null && _dynamicProps$desensi !== void 0 ? _dynamicProps$desensi : desensitization(...rowParams);
137
153
  }
138
154
 
139
155
  // 获取最终的disabled
@@ -145,8 +161,11 @@ var RenderField = _ref => {
145
161
  columnFieldProps: _fieldProps,
146
162
  params: rowParams
147
163
  });
164
+
165
+ // isEditable 处理 - 优先使用 hook 返回的值
148
166
  if ((0, _lodash.isFunction)(isEditable)) {
149
- isEditable = isEditable(...rowParams);
167
+ var _dynamicProps$isEdita;
168
+ isEditable = (_dynamicProps$isEdita = dynamicProps.isEditable) !== null && _dynamicProps$isEdita !== void 0 ? _dynamicProps$isEdita : isEditable(...rowParams);
150
169
  }
151
170
 
152
171
  // 是否只读文本
@@ -763,5 +782,21 @@ var _default = exports.default = /*#__PURE__*/(0, _react.memo)(RenderField, (pre
763
782
  return false;
764
783
  }
765
784
  }
785
+
786
+ // 特殊处理:当使用自定义 component 函数时,比较整个 record 对象
787
+ // 因为自定义组件可能依赖 record 中的其他字段(不只是当前列的 dataIndex)
788
+ if ((0, _lodash.isFunction)(prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn.component) || (0, _lodash.isFunction)(nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn.component)) {
789
+ // 浅比较 record 的所有属性
790
+ var prevKeys = Object.keys(prevRecord || {});
791
+ var nextKeys = Object.keys(nextRecord || {});
792
+ if (prevKeys.length !== nextKeys.length) {
793
+ return false;
794
+ }
795
+
796
+ // 使用 some 方法代替 for 循环
797
+ if (prevKeys.some(key => (prevRecord === null || prevRecord === void 0 ? void 0 : prevRecord[key]) !== (nextRecord === null || nextRecord === void 0 ? void 0 : nextRecord[key]))) {
798
+ return false;
799
+ }
800
+ }
766
801
  return true;
767
802
  });
@@ -26,7 +26,7 @@ var _RcTable = require("./components/RcTable");
26
26
  var _jsxRuntime = require("react/jsx-runtime");
27
27
  var _excluded = ["value", "onChange", "onDrag", "onDragEnd", "className", "columns", "mode", "stripe", "draggable", "disabled", "insertType", "emptyBtnText", "actionWidth", "actionProps", "toolbarProps", "toolbarSticky", "rowSelection", "onlyOneLineMsg", "deletePoConfirmMsg", "mulDeletePoConfirmMsg", "requiredAlign", "summary", "max", "headerRender", "pagination", "rowKey", "rowDisabled", "rowDraggable", "footerRender", "scroll", "actionDirection", "diffConfig"];
28
28
  var ProEditTable = (_ref, ref) => {
29
- var _resetProps$id, _resetProps$id$split, _themeConfig$data2, _resetProps$otherProp;
29
+ var _resetProps$id, _resetProps$id$split, _ref2, _formFieldProps$shoul, _themeConfig$data2, _resetProps$otherProp;
30
30
  var _ref$value = _ref.value,
31
31
  value = _ref$value === void 0 ? [] : _ref$value,
32
32
  onChange = _ref.onChange,
@@ -79,6 +79,7 @@ var ProEditTable = (_ref, ref) => {
79
79
  var affixRef = (0, _react.useRef)(null);
80
80
  var form = contentForm || (formFieldProps === null || formFieldProps === void 0 ? void 0 : formFieldProps.form) || (resetProps === null || resetProps === void 0 ? void 0 : resetProps.form);
81
81
  var name = (formFieldProps === null || formFieldProps === void 0 ? void 0 : formFieldProps.name) || (resetProps === null || resetProps === void 0 ? void 0 : resetProps.name) || (resetProps === null || resetProps === void 0 || (_resetProps$id = resetProps.id) === null || _resetProps$id === void 0 || (_resetProps$id$split = _resetProps$id.split) === null || _resetProps$id$split === void 0 ? void 0 : _resetProps$id$split.call(_resetProps$id, '_'));
82
+ var shouldUpdateDebounce = (_ref2 = (_formFieldProps$shoul = formFieldProps === null || formFieldProps === void 0 ? void 0 : formFieldProps.shouldUpdateDebounce) !== null && _formFieldProps$shoul !== void 0 ? _formFieldProps$shoul : resetProps === null || resetProps === void 0 ? void 0 : resetProps.shouldUpdateDebounce) !== null && _ref2 !== void 0 ? _ref2 : 200;
82
83
  var _formFieldProps$isVie = formFieldProps.isView,
83
84
  isView = _formFieldProps$isVie === void 0 ? false : _formFieldProps$isVie,
84
85
  _formFieldProps$viewE = formFieldProps.viewEmpty,
@@ -101,8 +102,8 @@ var ProEditTable = (_ref, ref) => {
101
102
  _useLocalStorageState2 = (0, _slicedToArray2.default)(_useLocalStorageState, 1),
102
103
  themeConfig = _useLocalStorageState2[0];
103
104
  var requiredAlign = (0, _react.useMemo)(() => {
104
- var _ref2, _themeConfig$data$zau, _themeConfig$data;
105
- return (_ref2 = (_themeConfig$data$zau = themeConfig === null || themeConfig === void 0 || (_themeConfig$data = themeConfig.data) === null || _themeConfig$data === void 0 ? void 0 : _themeConfig$data.zauiFormAlign) !== null && _themeConfig$data$zau !== void 0 ? _themeConfig$data$zau : configRequiredAlign) !== null && _ref2 !== void 0 ? _ref2 : 'left';
105
+ var _ref3, _themeConfig$data$zau, _themeConfig$data;
106
+ return (_ref3 = (_themeConfig$data$zau = themeConfig === null || themeConfig === void 0 || (_themeConfig$data = themeConfig.data) === null || _themeConfig$data === void 0 ? void 0 : _themeConfig$data.zauiFormAlign) !== null && _themeConfig$data$zau !== void 0 ? _themeConfig$data$zau : configRequiredAlign) !== null && _ref3 !== void 0 ? _ref3 : 'left';
106
107
  }, [themeConfig === null || themeConfig === void 0 || (_themeConfig$data2 = themeConfig.data) === null || _themeConfig$data2 === void 0 ? void 0 : _themeConfig$data2.zauiFormAlign, configRequiredAlign]);
107
108
  var _useSetState = (0, _ahooks.useSetState)({
108
109
  cellNamePath: [],
@@ -144,8 +145,8 @@ var ProEditTable = (_ref, ref) => {
144
145
  var getRowKey = (0, _react.useCallback)(record => {
145
146
  var key = record.rowKey || (0, _tools.getRandom)();
146
147
  if (rowKey) {
147
- var _ref3;
148
- key = (_ref3 = (0, _lodash.isFunction)(rowKey) ? rowKey(record) : record[rowKey]) !== null && _ref3 !== void 0 ? _ref3 : key;
148
+ var _ref4;
149
+ key = (_ref4 = (0, _lodash.isFunction)(rowKey) ? rowKey(record) : record[rowKey]) !== null && _ref4 !== void 0 ? _ref4 : key;
149
150
  }
150
151
  return key;
151
152
  }, [rowKey]);
@@ -180,7 +181,7 @@ var ProEditTable = (_ref, ref) => {
180
181
 
181
182
  // 分页变更
182
183
  var handlePageChange = (0, _react.useCallback)( /*#__PURE__*/function () {
183
- var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(current, pageSize) {
184
+ var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(current, pageSize) {
184
185
  return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
185
186
  while (1) switch (_context.prev = _context.next) {
186
187
  case 0:
@@ -226,7 +227,7 @@ var ProEditTable = (_ref, ref) => {
226
227
  }, _callee, null, [[0, 10]]);
227
228
  }));
228
229
  return function (_x, _x2) {
229
- return _ref4.apply(this, arguments);
230
+ return _ref5.apply(this, arguments);
230
231
  };
231
232
  }(), [pagination, page.pageSize, form, name]);
232
233
  var config = (0, _objectSpread2.default)({
@@ -263,6 +264,7 @@ var ProEditTable = (_ref, ref) => {
263
264
  rowDisabled,
264
265
  actionDirection,
265
266
  diffConfig: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, resetProps === null || resetProps === void 0 || (_resetProps$otherProp = resetProps.otherProps) === null || _resetProps$otherProp === void 0 ? void 0 : _resetProps$otherProp.diffConfig), diffConfig),
267
+ shouldUpdateDebounce,
266
268
  getIsNew,
267
269
  handlePageChange
268
270
  }, resetProps);
@@ -323,7 +325,7 @@ var ProEditTable = (_ref, ref) => {
323
325
 
324
326
  // 空列表状态
325
327
  var emptyDom = (0, _react.useMemo)(() => () => {
326
- var _filter, _ref5;
328
+ var _filter, _ref6;
327
329
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
328
330
  className: "com-empty",
329
331
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
@@ -334,7 +336,7 @@ var ProEditTable = (_ref, ref) => {
334
336
  className: "content",
335
337
  children: disabled || isForbiddenBtn('add') ? _locale.default.ProEditTable.noData : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
336
338
  children: [_locale.default.ProEditTable.noData, "\uFF0C", /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.RenderToolbar, (0, _objectSpread2.default)({}, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, config), {}, {
337
- toolbarProps: toolbarProps === null || toolbarProps === void 0 || (_filter = (_ref5 = toolbarProps).filter) === null || _filter === void 0 ? void 0 : _filter.call(_ref5, item => item.type === 'add' || (item === null || item === void 0 ? void 0 : item.persistence)),
339
+ toolbarProps: toolbarProps === null || toolbarProps === void 0 || (_filter = (_ref6 = toolbarProps).filter) === null || _filter === void 0 ? void 0 : _filter.call(_ref6, item => item.type === 'add' || (item === null || item === void 0 ? void 0 : item.persistence)),
338
340
  dataSource: []
339
341
  })))]
340
342
  })
@@ -402,6 +402,12 @@ export interface ProEditTableProps<T = any> extends Omit<TableProps<T>, 'onChang
402
402
  /** 是否跟随父元素滚动 */
403
403
  scrollFollowParent?: boolean;
404
404
  };
405
+ /**
406
+ * 动态属性更新防抖时间(毫秒)
407
+ * 用于优化表格编辑时的性能,对 fieldProps、desensitization, required、rules、isEditable, valueType 等属性进行防抖处理, 当设置为 0 时禁用防抖,所有属性立即响应
408
+ * @default 200
409
+ */
410
+ shouldUpdateDebounce?: number;
405
411
  }
406
412
  /**
407
413
  * 基础操作按钮类型(基于接口)