@zat-design/sisyphus-react 4.4.2 → 4.4.3

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 (55) hide show
  1. package/README.md +1 -42
  2. package/dist/index.esm.css +1 -1
  3. package/dist/less.esm.css +1 -1
  4. package/es/FormsProvider/index.d.ts +1 -1
  5. package/es/ProEditTable/components/RenderField/ListChangedWrapper.d.ts +1 -14
  6. package/es/ProEditTable/components/RenderField/ListChangedWrapper.js +27 -102
  7. package/es/ProEditTable/components/RenderField/index.js +269 -364
  8. package/es/ProEditTable/components/RenderField/propsType.d.ts +30 -0
  9. package/es/ProEditTable/components/RenderField/propsType.js +1 -0
  10. package/es/ProEditTable/components/RenderField/tools.d.ts +22 -0
  11. package/es/ProEditTable/components/RenderField/tools.js +203 -0
  12. package/es/ProEditTable/utils/config.js +5 -2
  13. package/es/ProEditTable/utils/index.js +11 -6
  14. package/es/ProEditTable/utils/tools.js +3 -2
  15. package/es/ProEnum/index.js +1 -1
  16. package/es/ProForm/components/FormFooter/propsType.d.ts +1 -1
  17. package/es/ProForm/components/base/DatePicker/index.js +3 -2
  18. package/es/ProForm/components/combination/Group/component/ComRender.js +1 -1
  19. package/es/ProForm/components/combination/Group/component/FlexibleGroup.js +4 -11
  20. package/es/ProForm/components/combination/Group/hooks/index.js +1 -2
  21. package/es/ProForm/components/combination/Group/utils/index.d.ts +16 -16
  22. package/es/ProForm/components/render/Render.js +149 -180
  23. package/es/ProForm/components/render/RenderFields.js +13 -38
  24. package/es/ProForm/components/render/propsType.d.ts +1 -18
  25. package/es/ProForm/components/render/propsType.js +0 -26
  26. package/es/ProForm/hooks/useControlled.d.ts +1 -0
  27. package/es/ProForm/hooks/useControlled.js +14 -0
  28. package/es/ProForm/hooks/useForm.d.ts +8 -0
  29. package/es/ProForm/{utils → hooks}/useForm.js +1 -1
  30. package/es/ProForm/{utils → hooks}/useRules.js +2 -2
  31. package/es/ProForm/{utils → hooks}/useShouldUpdate.d.ts +5 -1
  32. package/es/ProForm/{utils → hooks}/useShouldUpdate.js +30 -77
  33. package/es/ProForm/{utils → hooks}/useWatch.js +1 -1
  34. package/es/ProForm/index.js +5 -4
  35. package/es/ProForm/propsType.d.ts +13 -1
  36. package/es/ProForm/utils/buildFormItemProps.d.ts +25 -0
  37. package/es/ProForm/utils/buildFormItemProps.js +90 -0
  38. package/es/ProForm/utils/index.d.ts +2 -6
  39. package/es/ProForm/utils/index.js +3 -30
  40. package/es/ProForm/utils/reactiveValues.d.ts +34 -0
  41. package/es/ProForm/utils/reactiveValues.js +45 -0
  42. package/es/ProSelect/index.js +8 -7
  43. package/es/ProTree/components/ProTreeSelect/index.js +3 -2
  44. package/es/ProTree/utils.d.ts +9 -0
  45. package/es/ProTree/utils.js +31 -0
  46. package/es/ProTreeModal/components/Trigger.js +13 -12
  47. package/es/ProTreeModal/style/index.less +12 -1
  48. package/package.json +1 -2
  49. package/es/ProForm/utils/useForm.d.ts +0 -22
  50. /package/es/ProForm/{utils → hooks}/useDeepCompareMemo.d.ts +0 -0
  51. /package/es/ProForm/{utils → hooks}/useDeepCompareMemo.js +0 -0
  52. /package/es/ProForm/{utils → hooks}/useFieldProps.d.ts +0 -0
  53. /package/es/ProForm/{utils → hooks}/useFieldProps.js +0 -0
  54. /package/es/ProForm/{utils → hooks}/useRules.d.ts +0 -0
  55. /package/es/ProForm/{utils → hooks}/useWatch.d.ts +0 -0
@@ -1,5 +1,4 @@
1
1
  import _get from "lodash/get";
2
- import _isEqualWith from "lodash/isEqualWith";
3
2
  import _isFunction from "lodash/isFunction";
4
3
  import _omit from "lodash/omit";
5
4
  import _debounce from "lodash/debounce";
@@ -10,7 +9,7 @@ import _cloneDeep from "lodash/cloneDeep";
10
9
  import React, { useEffect, useCallback, useMemo, memo, useRef } from 'react';
11
10
  import { Form } from 'antd';
12
11
  import classNames from 'classnames';
13
- import { compatStartTransition, customEqualForFunction } from "../../../utils";
12
+ import { compatStartTransition } from "../../../utils";
14
13
  import valueTypeMap from "../../../ProForm/utils/valueType";
15
14
  import transformMap from "../../utils/transform";
16
15
  import { getNamePath, difference, getDisabled } from "../../utils/tools";
@@ -18,19 +17,16 @@ import * as componentMap from "../../../ProForm/components";
18
17
  import { useProConfig } from "../../../ProConfigProvider";
19
18
  import Container from "../../../ProForm/components/Container";
20
19
  import transformNames from "../../../ProForm/utils/transformNames";
21
- import { FieldProvider } from "../../../ProForm/utils/useFieldProps";
22
- import useRules from "../../../ProForm/utils/useRules";
20
+ import { FieldProvider } from "../../../ProForm/hooks/useFieldProps";
21
+ import useRules from "../../../ProForm/hooks/useRules";
23
22
  import { isSelect, isTrim } from "../../../ProForm/utils";
24
23
  import locale from "../../../locale";
25
24
  import ConfirmWrapper from "../../../ProForm/components/render/ConfirmWrapper";
26
25
  import { getDefaultProps } from "../../utils/getDefaultProps";
27
26
  import ListChangedWrapper from "./ListChangedWrapper";
28
27
  import useShouldUpdateForTable from "../../utils/useShouldUpdateForTable";
29
-
30
- /** 列配置中不应透传到 Form.Item 或 DOM 的字段(与 ProForm Render 保持一致) */
28
+ import { OMIT_FORM_ITEM_AND_DOM_KEYS, arePropsEqual } from "./tools";
31
29
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
32
- const OMIT_FORM_ITEM_AND_DOM_KEYS = ['format', 'toISOString', 'toCSTString', 'switchValue', 'precision', 'clearNotShow', 'dependNames', 'shouldCellUpdate' // 表格内部性能优化属性,不应传递给 Form.Item
33
- ];
34
30
  const RenderField = ({
35
31
  text: value,
36
32
  record,
@@ -51,7 +47,6 @@ const RenderField = ({
51
47
  originTitle,
52
48
  label,
53
49
  dataIndex,
54
- formItemProps,
55
50
  isEditable = true,
56
51
  required = false,
57
52
  rules = [],
@@ -66,7 +61,7 @@ const RenderField = ({
66
61
  const {
67
62
  mode,
68
63
  cellName,
69
- _isEditing,
64
+ _isEditing: isEditing,
70
65
  form,
71
66
  setState,
72
67
  name,
@@ -81,13 +76,13 @@ const RenderField = ({
81
76
  getIsNew,
82
77
  shouldUpdateDebounce
83
78
  } = config;
84
- let _fieldProps = fieldProps || formItemProps || {};
85
- let _rules = rules || [];
86
- let _required = required;
87
- let _valueType = valueType;
88
- let _disabled = false;
89
- let _desensitization = desensitization || [];
90
- let _component = component || editRender;
79
+ let lastFieldProps = fieldProps || {};
80
+ let lastRules = rules || [];
81
+ let lastRequired = required;
82
+ let lastValueType = valueType;
83
+ let lastDisabled = false;
84
+ let lastDesensitization = desensitization || [];
85
+ let lastComponent = component || editRender;
91
86
  const isSingleMode = mode === 'single';
92
87
 
93
88
  // type类型 首字母转大写
@@ -131,16 +126,16 @@ const RenderField = ({
131
126
  // required & rules & fieldProps & disabled & valueType 函数化处理
132
127
  // 优先使用 hook 返回的值,fallback 到原始值
133
128
  if (_isFunction(required)) {
134
- _required = dynamicProps.required ?? required(rowData, reactiveParams);
129
+ lastRequired = dynamicProps.required ?? required(rowData, reactiveParams);
135
130
  }
136
131
  if (_isFunction(fieldProps)) {
137
- _fieldProps = dynamicProps.fieldProps ?? fieldProps(rowData, reactiveParams);
132
+ lastFieldProps = dynamicProps.fieldProps ?? fieldProps(rowData, reactiveParams);
138
133
  }
139
134
  if (_isFunction(rules)) {
140
- _rules = dynamicProps.rules ?? rules(rowData, reactiveParams);
135
+ lastRules = dynamicProps.rules ?? rules(rowData, reactiveParams);
141
136
  }
142
137
  if (_isFunction(valueType)) {
143
- _valueType = dynamicProps.valueType ?? valueType(currentValue, rowData, {
138
+ lastValueType = dynamicProps.valueType ?? valueType(currentValue, rowData, {
144
139
  index,
145
140
  form,
146
141
  namePath: [...namePath, index],
@@ -148,16 +143,16 @@ const RenderField = ({
148
143
  });
149
144
  }
150
145
  if (_isFunction(desensitization)) {
151
- _desensitization = dynamicProps.desensitization ?? desensitization(rowData, reactiveParams);
146
+ lastDesensitization = dynamicProps.desensitization ?? desensitization(rowData, reactiveParams);
152
147
  }
153
148
 
154
149
  // 获取最终的disabled
155
- _disabled = getDisabled({
150
+ lastDisabled = getDisabled({
156
151
  globalControl: otherProps?.globalControl,
157
152
  formDisabled: otherProps?.formDisabled,
158
153
  column,
159
154
  tabledDisabled: config?.disabled,
160
- columnFieldProps: _fieldProps,
155
+ columnFieldProps: lastFieldProps,
161
156
  params: rowParams
162
157
  });
163
158
 
@@ -167,26 +162,28 @@ const RenderField = ({
167
162
  }
168
163
 
169
164
  // component 处理 - 优先使用 hook 返回的值
170
- if (_isFunction(_component)) {
171
- _component = dynamicProps.component ?? _component(rowData, reactiveParams);
165
+ if (_isFunction(lastComponent)) {
166
+ lastComponent = dynamicProps.component ?? lastComponent(rowData, reactiveParams);
172
167
  }
173
168
 
174
- // 更新 _editRender 为处理后的 _component
175
- const _editRender = _component;
169
+ // 更新 lastEditRender 为处理后的 lastComponent
170
+ const lastEditRender = lastComponent;
176
171
 
177
172
  // 是否只读文本
178
- const isView = !isEditable || record?.['is-view'] || config.isView || virtualKey && !_isEditing || getDisabled({
173
+ const isView = !isEditable || record?.['is-view'] || config.isView || virtualKey && !isEditing || getDisabled({
179
174
  globalControl: otherProps?.globalControl,
180
175
  formDisabled: otherProps?.formDisabled,
181
176
  column,
182
177
  tabledDisabled: config?.disabled,
183
- columnFieldProps: _fieldProps,
178
+ columnFieldProps: lastFieldProps,
184
179
  params: rowParams,
185
180
  rowDisabled: rowDisabled || 'empty'
186
181
  });
187
182
 
188
183
  // 只读文本时,采用当前formItem的name,单行编辑时,使用生成的虚拟的name
189
184
  const baseName = isView ? name : namePath;
185
+
186
+ // 多态:可能是内置组件类型、自定义 component,或已渲染的 ReactElement(lastEditRender),保留显式 any
190
187
  let TargetComponent;
191
188
 
192
189
  // 将Hooks调用移到组件顶层
@@ -197,18 +194,18 @@ const RenderField = ({
197
194
  names,
198
195
  label: label,
199
196
  labelRequired,
200
- required: _required,
201
- rules: _rules,
197
+ required: lastRequired,
198
+ rules: lastRules,
202
199
  isSelect: isSelect({
203
- dataSource: _fieldProps?.dataSource,
200
+ dataSource: lastFieldProps?.dataSource,
204
201
  type
205
202
  }),
206
203
  type
207
204
  });
208
205
 
209
- // 分离form item参数,防止对于参数透传(如onChange,防止重复触发)并优先级高于 _fieldProps 内部参数
206
+ // 分离form item参数,防止对于参数透传(如onChange,防止重复触发)并优先级高于 lastFieldProps 内部参数
210
207
  const formItemChildProps = {
211
- ..._fieldProps
208
+ ...lastFieldProps
212
209
  };
213
210
 
214
211
  // 使用useMemo优化defaultProps计算
@@ -220,7 +217,7 @@ const RenderField = ({
220
217
  }), [name, formNamePath, cellName, column?.type, column?.fieldProps]);
221
218
 
222
219
  // 允许formItem的属性放在column最外层 - 使用useMemo优化(剔除会透传到 DOM 的字段)
223
- const _formItemProps = useMemo(() => ({
220
+ const lastFormItemProps = useMemo(() => ({
224
221
  ...defaultProps,
225
222
  ..._omit(resetProps, OMIT_FORM_ITEM_AND_DOM_KEYS),
226
223
  ...internalRule,
@@ -231,7 +228,7 @@ const RenderField = ({
231
228
  // 当这些函数类型存在时,自动添加 shouldUpdate
232
229
  // 因为这些函数依赖行数据,当行数据变化时需要重新计算
233
230
  // 扩展到所有模式(single/multiple/cell),统一行为
234
- // 注意:需要检查原始的 component/editRender,而不是处理后的 _component
231
+ // 注意:需要检查原始的 component/editRender,而不是处理后的 lastComponent
235
232
  const hasFunctionDependency = _isFunction(column?.disabled) ||
236
233
  // disabled 是函数
237
234
  _isFunction(fieldProps) ||
@@ -252,7 +249,7 @@ const RenderField = ({
252
249
  // 性能优化已通过 useShouldUpdateForTable hook 的缓存和防抖机制实现
253
250
  if (hasFunctionDependency) {
254
251
  // 使用 shouldUpdate 监听同一行的数据变化;shouldUpdate 与 dependencies 互斥,始终优先 shouldUpdate
255
- _formItemProps.shouldUpdate = (prevValues, currentValues) => {
252
+ lastFormItemProps.shouldUpdate = (prevValues, currentValues) => {
256
253
  const prevRow = _get(prevValues, [...namePath, index]);
257
254
  const currentRow = _get(currentValues, [...namePath, index]);
258
255
  // 如果行数据发生变化,则重新渲染
@@ -260,8 +257,8 @@ const RenderField = ({
260
257
  };
261
258
  }
262
259
  if (['Switch', 'SwitchCheckbox'].includes(type)) {
263
- _formItemProps.valuePropName = 'checked';
264
- _valueType = 'switch';
260
+ lastFormItemProps.valuePropName = 'checked';
261
+ lastValueType = 'switch';
265
262
  }
266
263
 
267
264
  /**
@@ -270,11 +267,11 @@ const RenderField = ({
270
267
  */
271
268
  const defaultTransform = useCallback(() => {
272
269
  const types = ['DatePicker', 'RangePicker'];
273
- if (!_valueType && types.includes(type)) {
274
- return transformMap?.[type]?.(_fieldProps || {});
270
+ if (!lastValueType && types.includes(type)) {
271
+ return transformMap?.[type]?.(lastFieldProps || {});
275
272
  }
276
273
  return {};
277
- }, [_valueType, type, _fieldProps]);
274
+ }, [lastValueType, type, lastFieldProps]);
278
275
 
279
276
  /**
280
277
  * 配置valueType时,基于formItem的normalize与getValueProps进行值类型转换
@@ -283,14 +280,15 @@ const RenderField = ({
283
280
  const valueTypeTransform = useCallback(() => {
284
281
  // SwitchCheckbox默认YN, 兼容已有组件
285
282
  if (type === 'SwitchCheckbox') {
286
- _valueType = 'switch';
283
+ lastValueType = 'switch';
287
284
  }
288
285
  const params = {
289
286
  ...column,
290
- mode: _fieldProps?.mode
287
+ mode: lastFieldProps?.mode
291
288
  };
292
- return _isFunction(valueTypeMap[_valueType]) ? valueTypeMap[_valueType](params) : {};
293
- }, [type, _valueType, column, _fieldProps?.mode]);
289
+ const valueTypeKey = lastValueType;
290
+ return _isFunction(valueTypeMap[valueTypeKey]) ? valueTypeMap[valueTypeKey](params) : {};
291
+ }, [type, lastValueType, column, lastFieldProps?.mode]);
294
292
  if (names?.length) {
295
293
  // 支持names配置,临时生成对应的formItem,用来存储单个对应的值
296
294
  names = names.map(key => {
@@ -319,22 +317,23 @@ const RenderField = ({
319
317
  }
320
318
  const namesStr = [...baseName, index, dataIndex];
321
319
  return transformNames({
322
- ..._formItemProps,
320
+ ...lastFormItemProps,
323
321
  ...valueTypeTransform()
324
322
  }, form, names, namesStr, type);
325
- }, [names, baseName, index, dataIndex, _formItemProps, type]);
326
- if (!_editRender && typeof type === 'string') {
323
+ }, [names, baseName, index, dataIndex, lastFormItemProps, type]);
324
+ if (!lastEditRender && typeof type === 'string') {
325
+ // componentMap 为内置组件命名空间,按字符串 type 动态取用,保留显式 any 索引
327
326
  TargetComponent = componentMap[type] ?? /*#__PURE__*/_jsx(_Fragment, {});
328
327
  }
329
- if (isEditable && _isEditing) {
330
- // _editRender 已经是处理后的值(通过 dynamicProps.component 或直接计算)
331
- // 如果原本是函数,此时 _editRender 已经是执行后的 ReactNode
332
- // 如果原本是 ReactElement,_editRender 就是 ReactElement
333
- if ( /*#__PURE__*/React.isValidElement(_editRender)) {
334
- TargetComponent = _editRender;
335
- } else if (_editRender) {
328
+ if (isEditable && isEditing) {
329
+ // lastEditRender 已经是处理后的值(通过 dynamicProps.component 或直接计算)
330
+ // 如果原本是函数,此时 lastEditRender 已经是执行后的 ReactNode
331
+ // 如果原本是 ReactElement,lastEditRender 就是 ReactElement
332
+ if ( /*#__PURE__*/React.isValidElement(lastEditRender)) {
333
+ TargetComponent = lastEditRender;
334
+ } else if (lastEditRender) {
336
335
  // 其他情况(可能是字符串或其他类型的 ReactNode)
337
- TargetComponent = _editRender;
336
+ TargetComponent = lastEditRender;
338
337
  }
339
338
  }
340
339
 
@@ -399,9 +398,9 @@ const RenderField = ({
399
398
  const debounceRef = useRef(null);
400
399
 
401
400
  // 使用 useCallback 创建稳定的 onChange 函数
402
- const _onChange = useCallback(async (...args) => {
401
+ const handleChange = useCallback(async (...args) => {
403
402
  const executeChange = async (...innerArgs) => {
404
- let _args = [...innerArgs];
403
+ let callArgs = [...innerArgs];
405
404
  const rowPath = [...namePath, index];
406
405
  if (!onFieldChange && !onChange) {
407
406
  if (dependencies?.length) {
@@ -410,15 +409,15 @@ const RenderField = ({
410
409
  form.validateFields(validateFieldKeys);
411
410
  }, 100);
412
411
  }
413
- return null;
412
+ return;
414
413
  }
415
414
  const row = form.getFieldValue(rowPath, true);
416
415
  const orgRow = _cloneDeep(row);
417
416
  if (onFieldChange) {
418
- _args = formatArgs(innerArgs);
419
- _args[1] = row;
420
- TargetComponent?.props?.onFieldChange && (await TargetComponent.props.onFieldChange(..._args));
421
- onFieldChange && (await onFieldChange(..._args));
417
+ callArgs = formatArgs(innerArgs);
418
+ callArgs[1] = row;
419
+ TargetComponent?.props?.onFieldChange && (await TargetComponent.props.onFieldChange(...callArgs));
420
+ onFieldChange && (await onFieldChange(...callArgs));
422
421
 
423
422
  // onFieldChange 内已通过 form.setFieldValue(子路径) 或原地改 record 更新 store;此处再整行 setFieldValue(rowPath, rowAfter) 易用滞后快照覆盖 Field 刚写入的新值(如 formType)。仅延后读表做校验与 forceUpdate,不再整行回写。
424
423
  setTimeout(() => {
@@ -443,9 +442,9 @@ const RenderField = ({
443
442
  }
444
443
  }, 0);
445
444
  } else {
446
- _args = _args.concat([row, index, form]);
447
- TargetComponent?.props?.onChange && (await TargetComponent.props.onChange(..._args));
448
- onChange && (await onChange(..._args));
445
+ callArgs = callArgs.concat([row, index, form]);
446
+ TargetComponent?.props?.onChange && (await TargetComponent.props.onChange(...callArgs));
447
+ onChange && (await onChange(...callArgs));
449
448
  const rowAfter = row;
450
449
  form.setFieldValue(rowPath, rowAfter);
451
450
  if (validateTrigger && validateTrigger.includes('onChange')) {
@@ -484,18 +483,18 @@ const RenderField = ({
484
483
  };
485
484
  }, []);
486
485
 
487
- // 使用useCallback优化_onblur函数
488
- const _onblur = useCallback(async (...args) => {
486
+ // 使用useCallback优化handleBlur函数
487
+ const handleBlur = useCallback(async (...args) => {
489
488
  if (!onBlur) {
490
- return null;
489
+ return;
491
490
  }
492
- let _args = formatArgs(...args);
491
+ let callArgs = formatArgs(...args);
493
492
  const rowPath = [...namePath, index];
494
493
  const row = form.getFieldValue(rowPath, true);
495
494
  const orgRow = _cloneDeep(row);
496
- _args[1] = row;
497
- TargetComponent?.props?.onBlur && (await TargetComponent.props.onBlur(..._args));
498
- onBlur && (await onBlur(..._args));
495
+ callArgs[1] = row;
496
+ TargetComponent?.props?.onBlur && (await TargetComponent.props.onBlur(...callArgs));
497
+ onBlur && (await onBlur(...callArgs));
499
498
  // 判断属性是否变动
500
499
  form.setFieldValue(rowPath, row);
501
500
  if (validateTrigger && validateTrigger.includes('onBlur')) {
@@ -521,15 +520,15 @@ const RenderField = ({
521
520
  let componentProps = useMemo(() => ({
522
521
  form,
523
522
  name: cellName,
524
- ..._fieldProps,
523
+ ...lastFieldProps,
525
524
  ...TargetComponent?.props,
526
525
  namePath: [...namePath, index],
527
- disabled: _disabled,
528
- onChange: _onChange,
529
- onBlur: _onblur,
526
+ disabled: lastDisabled,
527
+ onChange: handleChange,
528
+ onBlur: handleBlur,
530
529
  index,
531
530
  confirm,
532
- desensitization: _desensitization,
531
+ desensitization: lastDesensitization,
533
532
  otherProps: {
534
533
  form,
535
534
  names,
@@ -538,15 +537,15 @@ const RenderField = ({
538
537
  listName: cellName,
539
538
  // 用于下拉框去重消费,保持和formlist一致
540
539
  viewEmpty,
541
- valueType: _valueType,
540
+ valueType: lastValueType,
542
541
  isView,
543
542
  desensitizationKey: otherProps?.desensitizationKey,
544
543
  source: 'ProEditTable'
545
544
  }
546
- }), [cellName, _fieldProps, TargetComponent?.props, namePath, index, _disabled, _onChange, _onblur, confirm, _desensitization, names, originalName, viewEmpty, _valueType, isView, otherProps?.desensitizationKey]);
545
+ }), [cellName, lastFieldProps, TargetComponent?.props, namePath, index, lastDisabled, handleChange, handleBlur, confirm, lastDesensitization, names, originalName, viewEmpty, lastValueType, isView, otherProps?.desensitizationKey]);
547
546
  componentProps = _omit(componentProps, ['onFieldChange', 'namePath', 'index', ...OMIT_FORM_ITEM_AND_DOM_KEYS]);
548
547
  if (['Switch', 'SwitchCheckbox'].includes(type)) {
549
- _formItemProps.valuePropName = 'checked';
548
+ lastFormItemProps.valuePropName = 'checked';
550
549
  }
551
550
 
552
551
  // 可编辑表格默认关闭scrollFollowParent
@@ -561,9 +560,9 @@ const RenderField = ({
561
560
  const trimProps = isTrim(type, trim, proConfig); // 使用顶层调用的proConfig
562
561
 
563
562
  const transformNormalize = namesTransformProps?.normalize ?? defaultTransformProps?.normalize;
564
- const userNormalize = _formItemProps?.normalize;
563
+ const userNormalize = lastFormItemProps?.normalize;
565
564
  const transformGetValueProps = namesTransformProps?.getValueProps ?? defaultTransformProps?.getValueProps;
566
- const userGetValueProps = _formItemProps?.getValueProps;
565
+ const userGetValueProps = lastFormItemProps?.getValueProps;
567
566
  const finalNormalize = transformNormalize && userNormalize ? (value, prevValue, allValues, isDiffMode) => {
568
567
  // 用户 normalize 需要拿到组件原始值(如 DatePicker 的 dayjs)
569
568
  const userValue = userNormalize(value, prevValue, allValues, isDiffMode);
@@ -584,203 +583,205 @@ const RenderField = ({
584
583
  };
585
584
  } : userGetValueProps || transformGetValueProps;
586
585
  return {
587
- ..._formItemProps,
586
+ ...lastFormItemProps,
588
587
  ...defaultTransformProps,
589
588
  ...namesTransformProps,
590
589
  ...trimProps,
591
590
  normalize: finalNormalize,
592
591
  getValueProps: finalGetValueProps
593
592
  };
594
- }, [_formItemProps, defaultTransform, namesTransform, type, trim, proConfig]);
593
+ }, [lastFormItemProps, defaultTransform, namesTransform, type, trim, proConfig]);
595
594
 
596
595
  // rules 的 isView 过滤已移至 getFieldItem 内处理(支持 shouldUpdate 模式下的动态 isEditable)
597
596
 
598
- const _className = useMemo(() => classNames({
597
+ const cellClassName = useMemo(() => classNames({
599
598
  [className]: className
600
599
  }), [className]);
601
600
 
602
- // 使用useCallback优化getFieldItem函数
603
- const getFieldItem = (shouldUpdateMode = false) => {
604
- // 如果处于 shouldUpdate 模式,需要重新获取最新的行数据并重新计算依赖值
605
- let finalComponentProps = componentProps;
606
- // shouldUpdate 模式下会被更新为最新值,供外层 FieldProvider 消费
607
- let latestIsView = isView;
608
- // 用于在 shouldUpdate 模式下重建正确的 Form.Item rules(外层 finalFormItemProps 是旧闭包)
609
- let effectiveRequired = _required;
610
- let effectiveRules = _rules;
611
- let effectiveFieldProps = _fieldProps;
612
- if (shouldUpdateMode) {
613
- // 重新获取最新的行数据(shouldUpdate 触发时,通过 getFieldValue 拿到最新值)
614
- const latestRowData = form.getFieldValue([...namePath, index]) || record || {};
615
- const latestReactiveParams = {
616
- form,
617
- index,
618
- namePath: [...namePath, index]
619
- };
620
- const latestRowParams = [latestRowData, latestReactiveParams];
601
+ // shouldUpdate 模式下重新获取最新行数据并重算所有响应式属性,返回最新渲染状态(不修改外层闭包)
602
+ const recalcShouldUpdateState = () => {
603
+ // 重新获取最新的行数据(shouldUpdate 触发时,通过 getFieldValue 拿到最新值)
604
+ const latestRowData = form.getFieldValue([...namePath, index]) || record || {};
605
+ const latestReactiveParams = {
606
+ form,
607
+ index,
608
+ namePath: [...namePath, index]
609
+ };
610
+ const latestRowParams = [latestRowData, latestReactiveParams];
621
611
 
622
- // ⭐ 关键修改:shouldUpdate 模式下,跳过缓存,直接重新计算所有响应式属性
623
- let latestFieldProps = fieldProps || formItemProps || {};
624
- if (_isFunction(fieldProps)) {
625
- latestFieldProps = fieldProps(latestRowData, latestReactiveParams);
626
- }
612
+ // ⭐ 关键修改:shouldUpdate 模式下,跳过缓存,直接重新计算所有响应式属性
613
+ let latestFieldProps = fieldProps || {};
614
+ if (_isFunction(fieldProps)) {
615
+ latestFieldProps = fieldProps(latestRowData, latestReactiveParams);
616
+ }
627
617
 
628
- // 重新计算 required(用于可能的后续逻辑)
629
- let latestRequired = required;
630
- if (_isFunction(required)) {
631
- latestRequired = required(latestRowData, latestReactiveParams);
632
- }
618
+ // 重新计算 required(用于可能的后续逻辑)
619
+ let latestRequired = required;
620
+ if (_isFunction(required)) {
621
+ latestRequired = required(latestRowData, latestReactiveParams);
622
+ }
633
623
 
634
- // 重新计算 rules(用于可能的后续逻辑)
635
- let latestRules = rules;
636
- if (_isFunction(rules)) {
637
- latestRules = rules(latestRowData, latestReactiveParams);
638
- }
624
+ // 重新计算 rules(用于可能的后续逻辑)
625
+ let latestRules = rules;
626
+ if (_isFunction(rules)) {
627
+ latestRules = rules(latestRowData, latestReactiveParams);
628
+ }
639
629
 
640
- // 同步到外层变量,用于后续构建 activeFinalFormItemProps
641
- effectiveRequired = latestRequired;
642
- effectiveRules = latestRules;
643
- effectiveFieldProps = latestFieldProps;
630
+ // 重新计算 desensitization
631
+ let latestDesensitization = desensitization || [];
632
+ if (_isFunction(desensitization)) {
633
+ latestDesensitization = desensitization(latestRowData, latestReactiveParams);
634
+ }
644
635
 
645
- // 重新计算 desensitization
646
- let latestDesensitization = desensitization || [];
647
- if (_isFunction(desensitization)) {
648
- latestDesensitization = desensitization(latestRowData, latestReactiveParams);
649
- }
636
+ // 重新计算 component
637
+ let latestComponent = component || editRender;
638
+ if (_isFunction(latestComponent)) {
639
+ latestComponent = latestComponent(latestRowData, latestReactiveParams);
640
+ }
650
641
 
651
- // 重新计算 component
652
- let latestComponent = component || editRender;
653
- if (_isFunction(latestComponent)) {
654
- latestComponent = latestComponent(latestRowData, latestReactiveParams);
655
- }
642
+ // 重新计算 isEditable(使用原始的 column.isEditable,而不是处理后的 isEditable)
643
+ let latestIsEditable = column.isEditable ?? true;
644
+ if (_isFunction(column.isEditable)) {
645
+ latestIsEditable = column.isEditable(latestRowData, latestReactiveParams);
646
+ }
656
647
 
657
- // 重新计算 isEditable(使用原始的 column.isEditable,而不是处理后的 isEditable)
658
- let latestIsEditable = column.isEditable ?? true;
659
- if (_isFunction(column.isEditable)) {
660
- latestIsEditable = column.isEditable(latestRowData, latestReactiveParams);
661
- }
648
+ // 重新计算 disabled
649
+ const latestDisabled = getDisabled({
650
+ globalControl: otherProps?.globalControl,
651
+ formDisabled: otherProps?.formDisabled,
652
+ column,
653
+ tabledDisabled: config?.disabled,
654
+ columnFieldProps: latestFieldProps,
655
+ params: latestRowParams
656
+ });
662
657
 
663
- // 重新计算 disabled
664
- const latestDisabled = getDisabled({
665
- globalControl: otherProps?.globalControl,
666
- formDisabled: otherProps?.formDisabled,
667
- column,
668
- tabledDisabled: config?.disabled,
669
- columnFieldProps: latestFieldProps,
670
- params: latestRowParams
671
- });
658
+ // 更新 componentProps 中的所有响应式属性
659
+ // latestTargetComponent 稍后计算,此处先占位;最终会在下方合并 latestTargetComponent?.props
660
+ let latestComponentProps = {
661
+ ...componentProps,
662
+ ...latestFieldProps,
663
+ disabled: latestDisabled,
664
+ desensitization: latestDesensitization,
665
+ // shouldUpdate 模式下,确保事件包装函数不被 fieldProps 覆盖
666
+ onChange: handleChange,
667
+ onBlur: handleBlur
668
+ };
672
669
 
673
- // 更新 componentProps 中的所有响应式属性
674
- // latestTargetComponent 稍后计算,此处先占位;最终 finalComponentProps 会在下方合并 latestTargetComponent?.props
675
- finalComponentProps = {
676
- ...componentProps,
677
- ...latestFieldProps,
678
- disabled: latestDisabled,
679
- desensitization: latestDesensitization,
680
- // shouldUpdate 模式下,确保事件包装函数不被 fieldProps 覆盖
681
- onChange: _onChange,
682
- onBlur: _onblur
683
- };
670
+ // 关键修改:在 shouldUpdate 模式下,需要重新设置 TargetComponent
671
+ // 因为 component 函数可能返回不同的结果
672
+ let latestTargetComponent = TargetComponent;
684
673
 
685
- // ⭐ 关键修改:在 shouldUpdate 模式下,需要重新设置 TargetComponent
686
- // 因为 component 函数可能返回不同的结果
687
- let latestTargetComponent = TargetComponent;
674
+ // 首先检查是否有内置type
675
+ if (!latestComponent && typeof type === 'string') {
676
+ latestTargetComponent = componentMap[type] ?? /*#__PURE__*/_jsx(_Fragment, {});
677
+ }
688
678
 
689
- // 首先检查是否有内置type
690
- if (!latestComponent && typeof type === 'string') {
691
- latestTargetComponent = componentMap[type] ?? /*#__PURE__*/_jsx(_Fragment, {});
679
+ // 然后处理自定义 component
680
+ const latestIsView = !latestIsEditable || record?.['is-view'] || config.isView || virtualKey && !isEditing || getDisabled({
681
+ globalControl: otherProps?.globalControl,
682
+ formDisabled: otherProps?.formDisabled,
683
+ column,
684
+ tabledDisabled: config?.disabled,
685
+ columnFieldProps: latestFieldProps,
686
+ params: latestRowParams,
687
+ rowDisabled: rowDisabled || 'empty'
688
+ });
689
+ if (latestIsEditable && isEditing) {
690
+ if ( /*#__PURE__*/React.isValidElement(latestComponent)) {
691
+ latestTargetComponent = latestComponent;
692
+ } else if (latestComponent) {
693
+ latestTargetComponent = latestComponent;
692
694
  }
695
+ }
693
696
 
694
- // 然后处理自定义 component
695
- latestIsView = !latestIsEditable || record?.['is-view'] || config.isView || virtualKey && !_isEditing || getDisabled({
696
- globalControl: otherProps?.globalControl,
697
- formDisabled: otherProps?.formDisabled,
698
- column,
699
- tabledDisabled: config?.disabled,
700
- columnFieldProps: latestFieldProps,
701
- params: latestRowParams,
702
- rowDisabled: rowDisabled || 'empty'
703
- });
704
- if (latestIsEditable && _isEditing) {
705
- if ( /*#__PURE__*/React.isValidElement(latestComponent)) {
706
- latestTargetComponent = latestComponent;
707
- } else if (latestComponent) {
708
- latestTargetComponent = latestComponent;
709
- }
697
+ // 查看模式
698
+ if (latestIsView) {
699
+ if (typeof viewRender === 'function') {
700
+ const latestCurrentValue = dataIndex ? latestRowData?.[dataIndex] : null;
701
+ const View = viewRender(latestCurrentValue, latestRowData || {}, options);
702
+ latestTargetComponent = /*#__PURE__*/_jsx(Container, {
703
+ viewEmpty: viewEmpty,
704
+ children: View
705
+ });
710
706
  }
711
-
712
- // 查看模式
713
- if (latestIsView) {
714
- if (typeof viewRender === 'function') {
715
- const latestCurrentValue = dataIndex ? latestRowData?.[dataIndex] : null;
716
- const View = viewRender(latestCurrentValue, latestRowData || {}, options);
717
- latestTargetComponent = /*#__PURE__*/_jsx(Container, {
718
- viewEmpty: viewEmpty,
719
- children: View
720
- });
721
- }
722
- if ( /*#__PURE__*/React.isValidElement(viewRender)) {
723
- latestTargetComponent = viewRender;
724
- }
707
+ if ( /*#__PURE__*/React.isValidElement(viewRender)) {
708
+ latestTargetComponent = viewRender;
725
709
  }
710
+ }
726
711
 
727
- // 使用重新计算的 TargetComponent
728
- TargetComponent = latestTargetComponent;
729
-
730
- // shouldUpdate 触发时外层 componentProps.otherProps.isView 是旧快照,需用最新值覆盖
731
- finalComponentProps = {
732
- ...finalComponentProps,
733
- otherProps: {
734
- ...finalComponentProps.otherProps,
735
- isView: latestIsView
736
- }
737
- };
712
+ // shouldUpdate 触发时外层 componentProps.otherProps.isView 是旧快照,需用最新值覆盖
713
+ latestComponentProps = {
714
+ ...latestComponentProps,
715
+ otherProps: {
716
+ ...latestComponentProps.otherProps,
717
+ isView: latestIsView
718
+ }
719
+ };
738
720
 
739
- // componentProps 里展开了外层旧 TargetComponent?.props(如 { formType: "Input" }),
740
- // 用 latestTargetComponent?.props 覆盖,确保不会被旧 cloneElement props 污染
741
- if ( /*#__PURE__*/React.isValidElement(latestTargetComponent)) {
742
- const componentProps = latestTargetComponent.props;
743
- // 确保 props 是对象类型才进行展开
744
- if (componentProps && typeof componentProps === 'object') {
745
- finalComponentProps = {
746
- ...finalComponentProps,
747
- ...componentProps,
748
- // 始终保证事件处理函数不被覆盖
749
- onChange: _onChange,
750
- onBlur: _onblur
751
- };
752
- }
721
+ // componentProps 里展开了外层旧 TargetComponent?.props(如 { formType: "Input" }),
722
+ // 用 latestTargetComponent?.props 覆盖,确保不会被旧 cloneElement props 污染
723
+ if ( /*#__PURE__*/React.isValidElement(latestTargetComponent)) {
724
+ const elementProps = latestTargetComponent.props;
725
+ // 确保 props 是对象类型才进行展开
726
+ if (elementProps && typeof elementProps === 'object') {
727
+ latestComponentProps = {
728
+ ...latestComponentProps,
729
+ ...elementProps,
730
+ // 始终保证事件处理函数不被覆盖
731
+ onChange: handleChange,
732
+ onBlur: handleBlur
733
+ };
753
734
  }
754
735
  }
736
+ return {
737
+ finalComponentProps: latestComponentProps,
738
+ targetComponent: latestTargetComponent,
739
+ latestIsView,
740
+ effectiveRequired: latestRequired,
741
+ effectiveRules: latestRules,
742
+ effectiveFieldProps: latestFieldProps
743
+ };
744
+ };
755
745
 
756
- // 根据 latestIsView 和最新的 required/rules 构建正确的 Form.Item props
757
- // 解决 shouldUpdate 触发时外层 finalFormItemProps 是旧闭包(rules 基于旧 isView 计算)的问题
758
- let activeFinalFormItemProps = finalFormItemProps;
746
+ // 根据 latestIsView 和最新 required/rules 构建正确的 Form.Item props
747
+ // 解决 shouldUpdate 触发时外层 finalFormItemProps 是旧闭包(rules 基于旧 isView 计算)的问题
748
+ const buildActiveFormItemProps = ({
749
+ latestIsView,
750
+ shouldUpdateMode,
751
+ effectiveRequired,
752
+ effectiveRules,
753
+ effectiveFieldProps
754
+ }) => {
759
755
  if (latestIsView) {
760
756
  // 查看模式:移除 rules 不做校验
761
- activeFinalFormItemProps = _omit(finalFormItemProps, ['rules']);
762
- } else if (shouldUpdateMode) {
757
+ return _omit(finalFormItemProps, ['rules']);
758
+ }
759
+ if (shouldUpdateMode) {
763
760
  // shouldUpdate 模式下 finalFormItemProps 是旧闭包,需用最新 effectiveRequired/effectiveRules 重建 rules
764
761
  const activeRules = Array.isArray(effectiveRules) ? [...effectiveRules] : [];
765
762
  const hasRequiredRule = activeRules.some(r => r?.required === true);
766
763
  if (effectiveRequired && !hasRequiredRule) {
767
- const _isSelectVal = isSelect({
764
+ const isSelectVal = isSelect({
768
765
  dataSource: effectiveFieldProps?.dataSource,
769
766
  type
770
767
  });
771
768
  activeRules.push({
772
769
  required: true,
773
- message: `${_isSelectVal ? locale.ProForm.selectPlaceHolder : locale.ProForm.inputPlaceholder}${label || ''}`
770
+ message: `${isSelectVal ? locale.ProForm.selectPlaceHolder : locale.ProForm.inputPlaceholder}${label || ''}`
774
771
  });
775
772
  }
776
- activeFinalFormItemProps = {
773
+ return {
777
774
  ...finalFormItemProps,
778
775
  rules: activeRules.length > 0 ? activeRules : [{
779
776
  required: false
780
777
  }]
781
778
  };
782
779
  }
783
- let FormItem = null;
780
+ return finalFormItemProps;
781
+ };
782
+
783
+ // 组装字段组件:DOM 透传字段过滤、克隆/创建目标元素、原始值对比包裹(ListChangedWrapper)、确认弹窗包裹(ConfirmWrapper)
784
+ const assembleFieldComponent = finalComponentProps => {
784
785
  // 当 viewRender 存在时,需要排除 finalComponentProps 中的 children,避免覆盖 Container 的 children
785
786
  let propsForTarget = isView && typeof viewRender === 'function' ? _omit(finalComponentProps, ['children']) : finalComponentProps;
786
787
  // 当目标为原生 DOM 元素(如 viewRender 返回 <div>)时,剔除 disabled、toCSTString 等,避免 React 警告
@@ -811,8 +812,8 @@ const RenderField = ({
811
812
  form: form,
812
813
  onDiff: onDiff,
813
814
  type: type,
814
- onChange: _onChange,
815
- onBlur: _onblur,
815
+ onChange: handleChange,
816
+ onBlur: handleBlur,
816
817
  valuePropName: finalFormItemProps.valuePropName,
817
818
  normalize: finalFormItemProps.normalize,
818
819
  getValueProps: finalFormItemProps.getValueProps,
@@ -828,11 +829,42 @@ const RenderField = ({
828
829
  children: FieldComponent
829
830
  });
830
831
  }
831
- FormItem = TargetComponent ? /*#__PURE__*/_jsx(Form.Item, {
832
+ return FieldComponent;
833
+ };
834
+
835
+ // 使用useCallback优化getFieldItem函数
836
+ const getFieldItem = (shouldUpdateMode = false) => {
837
+ // 如果处于 shouldUpdate 模式,需要重新获取最新的行数据并重新计算依赖值
838
+ let finalComponentProps = componentProps;
839
+ // shouldUpdate 模式下会被更新为最新值,供外层 FieldProvider 消费
840
+ let latestIsView = isView;
841
+ // 用于在 shouldUpdate 模式下重建正确的 Form.Item rules(外层 finalFormItemProps 是旧闭包)
842
+ let effectiveRequired = lastRequired;
843
+ let effectiveRules = lastRules;
844
+ let effectiveFieldProps = lastFieldProps;
845
+ if (shouldUpdateMode) {
846
+ const recomputed = recalcShouldUpdateState();
847
+ finalComponentProps = recomputed.finalComponentProps;
848
+ // shouldUpdate 模式下用重算结果覆盖外层 TargetComponent,供下方组装逻辑消费
849
+ TargetComponent = recomputed.targetComponent;
850
+ latestIsView = recomputed.latestIsView;
851
+ effectiveRequired = recomputed.effectiveRequired;
852
+ effectiveRules = recomputed.effectiveRules;
853
+ effectiveFieldProps = recomputed.effectiveFieldProps;
854
+ }
855
+ const activeFinalFormItemProps = buildActiveFormItemProps({
856
+ latestIsView,
857
+ shouldUpdateMode,
858
+ effectiveRequired,
859
+ effectiveRules,
860
+ effectiveFieldProps
861
+ });
862
+ const FieldComponent = assembleFieldComponent(finalComponentProps);
863
+ let FormItem = TargetComponent ? /*#__PURE__*/_jsx(Form.Item, {
832
864
  validateFirst: true,
833
- ..._omit(activeFinalFormItemProps, ['render', 'key', 'width', 'hiddenNames', 'name', 'onCell', 'disabled', _formItemProps.shouldUpdate ? 'shouldUpdate' : null]),
865
+ ..._omit(activeFinalFormItemProps, ['render', 'key', 'width', 'hiddenNames', 'name', 'onCell', 'disabled', lastFormItemProps.shouldUpdate ? 'shouldUpdate' : null]),
834
866
  // 移除非必要字段,但保留 dependencies
835
- className: _className,
867
+ className: cellClassName,
836
868
  name: formNamePath ? cellName.slice(formNamePath?.length - 1) : cellName,
837
869
  children: FieldComponent
838
870
  }) : /*#__PURE__*/_jsx(Container, {
@@ -876,131 +908,4 @@ const RenderField = ({
876
908
  })
877
909
  });
878
910
  };
879
- export default /*#__PURE__*/memo(RenderField, (prevProps, nextProps) => {
880
- // 自定义比较函数,只有关键props变化时才重新渲染
881
- const {
882
- text: prevText,
883
- record: prevRecord,
884
- index: prevIndex,
885
- column: prevColumn,
886
- config: prevConfig
887
- } = prevProps;
888
- const {
889
- text: nextText,
890
- record: nextRecord,
891
- index: nextIndex,
892
- column: nextColumn,
893
- config: nextConfig
894
- } = nextProps;
895
-
896
- // 自定义 component/editRender 且行对象为同引用时,浅比较无法区分原地修改,需强制重渲染
897
- const hasFunctionComponent = _isFunction(prevColumn?.component) || _isFunction(prevColumn?.editRender) || _isFunction(nextColumn?.component) || _isFunction(nextColumn?.editRender);
898
- if (hasFunctionComponent && prevRecord === nextRecord) {
899
- return false;
900
- }
901
-
902
- // 构建新的参数格式(与 ProForm 保持一致)
903
- const prevNamePath = getNamePath(prevConfig?.name, prevConfig?.virtualKey);
904
- const nextNamePath = getNamePath(nextConfig?.name, nextConfig?.virtualKey);
905
- const prevReactiveParams = {
906
- form: prevConfig?.form,
907
- index: prevIndex,
908
- namePath: [...prevNamePath, prevIndex]
909
- };
910
- const nextReactiveParams = {
911
- form: nextConfig?.form,
912
- index: nextIndex,
913
- namePath: [...nextNamePath, nextIndex]
914
- };
915
- const prevRowParams = [prevRecord, prevReactiveParams];
916
- const nextRowParams = [nextRecord, nextReactiveParams];
917
- if (_isFunction(prevColumn?.disabled) && _isFunction(nextColumn?.disabled)) {
918
- if (prevColumn?.disabled(prevRecord, prevReactiveParams) !== nextColumn?.disabled(nextRecord, nextReactiveParams)) {
919
- return false;
920
- }
921
- }
922
-
923
- // fieldProps 函数化直接更新,无法比对返回值是否一致
924
- // 优化:不直接调用函数,而是比较输入参数(record 和 reactiveParams)
925
- // 如果输入参数相同,fieldProps 的返回值应该相同(纯函数假设)
926
- if (_isFunction(prevColumn?.fieldProps) && _isFunction(nextColumn?.fieldProps)) {
927
- // 比较 record 数据是否变化
928
- if (!_isEqualWith(prevRecord, nextRecord, customEqualForFunction)) {
929
- return false;
930
- }
931
- // reactiveParams 中的 form、index、namePath 已经在外层比较过了,无需重复比较
932
- }
933
- // fieldProps 为对象时,必须比较配置变化(如 dataSource 异步更新)
934
- if (!_isFunction(prevColumn?.fieldProps) && !_isFunction(nextColumn?.fieldProps)) {
935
- const isFieldPropsEqual = _isEqualWith(prevColumn?.fieldProps, nextColumn?.fieldProps, customEqualForFunction);
936
- if (!isFieldPropsEqual) {
937
- return false;
938
- }
939
- }
940
-
941
- // 通用函数比较方法
942
- // 优化:不直接调用函数,而是比较函数引用和输入参数
943
- const compareFunctionResult = (prevColumn, nextColumn, prevValues, nextValues, prevReactiveParams, nextReactiveParams, functionName) => {
944
- const prevFunc = prevColumn?.[functionName];
945
- const nextFunc = nextColumn?.[functionName];
946
- if (_isFunction(prevFunc) && _isFunction(nextFunc)) {
947
- // 函数引用变化说明闭包可能捕获了新的外部状态(如异步加载的 list),必须重渲染
948
- if (prevFunc !== nextFunc) return false;
949
- // 同引用函数,比较输入参数(纯函数假设:输入相同则输出相同)
950
- return _isEqualWith(prevValues, nextValues, customEqualForFunction);
951
- }
952
- return true; // 如果不是函数或只有一个是函数,认为相等
953
- };
954
-
955
- // 使用简化后的比较逻辑
956
- const functionFields = ['rules', 'component', 'desensitization', 'isEditable', 'required'];
957
- if (functionFields.some(field => !compareFunctionResult(prevColumn, nextColumn, prevRecord, nextRecord, prevReactiveParams, nextReactiveParams, field))) {
958
- return false;
959
- }
960
-
961
- // 基本props比较
962
- if (!_isEqual(prevText, nextText) || prevIndex !== nextIndex) {
963
- return false;
964
- }
965
-
966
- // 记录关键字段比较(避免完整对象比较的性能开销)
967
- if (prevRecord?.rowKey !== nextRecord?.rowKey || prevRecord?._addFlag !== nextRecord?._addFlag) {
968
- return false;
969
- }
970
-
971
- // 列配置比较(只比较关键字段),required,disabled为函数时,需要重新计算
972
- if (prevColumn?.dataIndex !== nextColumn?.dataIndex || prevColumn?.type !== nextColumn?.type || prevColumn?.name !== nextColumn?.name) {
973
- return false;
974
- }
975
-
976
- // config中关键字段比较
977
- if (prevConfig?._isEditing !== nextConfig?._isEditing || prevConfig?.mode !== nextConfig?.mode) {
978
- return false;
979
- }
980
-
981
- // 当前单元格的值比较
982
- const prevDataIndex = prevColumn?.dataIndex;
983
- const nextDataIndex = nextColumn?.dataIndex;
984
- if (prevDataIndex && nextDataIndex && prevDataIndex === nextDataIndex) {
985
- if (prevRecord?.[prevDataIndex] !== nextRecord?.[nextDataIndex]) {
986
- return false;
987
- }
988
- }
989
-
990
- // 特殊处理:当使用自定义 component 函数时,比较整个 record 对象
991
- // 因为自定义组件可能依赖 record 中的其他字段(不只是当前列的 dataIndex)
992
- if (_isFunction(prevColumn?.component) || _isFunction(nextColumn?.component)) {
993
- // 浅比较 record 的所有属性
994
- const prevKeys = Object.keys(prevRecord || {});
995
- const nextKeys = Object.keys(nextRecord || {});
996
- if (prevKeys.length !== nextKeys.length) {
997
- return false;
998
- }
999
-
1000
- // 使用 some 方法代替 for 循环
1001
- if (prevKeys.some(key => prevRecord?.[key] !== nextRecord?.[key])) {
1002
- return false;
1003
- }
1004
- }
1005
- return true;
1006
- });
911
+ export default /*#__PURE__*/memo(RenderField, arePropsEqual);