@openli1115/lowcode-edit-pro-table 1.0.61 → 1.0.63

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.
@@ -8,7 +8,8 @@ import { useProBoundValue } from "../../context/useProBoundValue";
8
8
  import { FORM_EMPTY_ARRAY } from "../../context/useComponentContext";
9
9
  var _window$React = window.React,
10
10
  createElement = _window$React.createElement,
11
- useCallback = _window$React.useCallback;
11
+ useCallback = _window$React.useCallback,
12
+ useMemo = _window$React.useMemo;
12
13
 
13
14
  /**
14
15
  * 按路径在树形 dataSource 上逐级匹配,取出每一层的 label(2 级、3 级…任意多级,长度由 pathValues 决定)。
@@ -96,7 +97,8 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
96
97
  disabledProp = props.disabled,
97
98
  _schemaValue = props.value,
98
99
  schemaOnChange = props.onChange,
99
- defaultValue = props.defaultValue;
100
+ defaultValue = props.defaultValue,
101
+ multiple = props.multiple;
100
102
  var _resolveProScreenBind = resolveProScreenBinding({
101
103
  screen_structure: screen_structure,
102
104
  screen_structure_field: screen_structure_field,
@@ -114,12 +116,26 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
114
116
  commit(next);
115
117
  schemaOnChange === null || schemaOnChange === void 0 ? void 0 : schemaOnChange(next, structureName, structureField);
116
118
  };
119
+
120
+ /** 表单/接口:完整路径 string[],如 ['2974','2975'] */
117
121
  var displayValue = normalizeCascaderPath(value);
118
122
 
119
123
  /**
120
- * Fusion 单选 getSingleData 对数组 value 只会用 value[0] 查节点,输入框文案不完整。
121
- * 表单存全路径 [省,市,区,...] 任意多级时,用 dataSource 拼「一级 / 二级 / …」。
124
+ * Fusion 单选:官方约定受控 value string[] | number[],且实现里只对数组取 value[0] 再查节点。
125
+ * 若传入完整路径 [父,子],会把「父」当成选中项,文案只有一级。
126
+ * 组件展示应传「叶子」单元素数组 [leaf],内部 getLabelPath(叶子节点) 会生成多级展示。
127
+ * 多选仍传 Fusion 所需的多个 value(与表单存值一致)。
122
128
  */
129
+ var valueForFusion = useMemo(function () {
130
+ var path = displayValue;
131
+ if (multiple) {
132
+ return path;
133
+ }
134
+ if (path.length === 0) return [];
135
+ return [path[path.length - 1]];
136
+ }, [displayValue, multiple]);
137
+
138
+ /** dataSource 未就绪或异步时,仍用自定义文案兜底 */
123
139
  var schemaDisplayRender = props.displayRender;
124
140
  var pathDisplayRender = useCallback(function (labels, data) {
125
141
  var fullLabels = resolvePathLabels(dataSource, normalizeCascaderPath(value));
@@ -137,7 +153,7 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
137
153
  readOnly: disableEdit ? true : readOnlyProp,
138
154
  disabled: disabledProp,
139
155
  dataSource: dataSource,
140
- value: displayValue,
156
+ value: valueForFusion,
141
157
  onChange: handleChange,
142
158
  displayRender: pathDisplayRender
143
159
  })));
@@ -42,15 +42,37 @@ export var FormProvider = function FormProvider(_ref) {
42
42
  values = _useState[0],
43
43
  setValues = _useState[1];
44
44
 
45
- // 仅当 initialValues 引用变化时更新状态
45
+ /** 每次渲染同步,供 initialValues effect 判断「store 是否只是回灌了当前表单已有数据」 */
46
+ var valuesRef = useRef(values);
47
+ valuesRef.current = values;
48
+
49
+ /**
50
+ * store 每次 dispatch 都会给新的 screenStructures 引用;若内容与表单 state 实际一致仍 setValues,
51
+ * 会整页重渲染(含 EditProTable、ss_xxx_tab 等大表),Fusion Overlay/Select 反复 setPosition,
52
+ * 易触发 React #185(Maximum update depth exceeded)。
53
+ *
54
+ * 仅与 initialValuesRef 比较不够:用户改字段后 onChange 已把同一份数据写回 store,若此时再 merge,
55
+ * 或与内表 mutate 的 window.screenStructures 产生细微差异,会反复 setValues 形成环。
56
+ * 因此:initialValues 与当前表单 values 深度相等时,一律不再 setValues。
57
+ */
46
58
  useEffect(function () {
47
- if (!isEqual(initialValues, initialValuesRef.current)) {
48
- console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
59
+ if (isEqual(initialValues, valuesRef.current)) {
60
+ initialValuesRef.current = initialValues;
61
+ return;
62
+ }
63
+ if (isEqual(initialValues, initialValuesRef.current)) {
49
64
  initialValuesRef.current = initialValues;
50
- setValues(function (prev) {
51
- return _extends({}, prev, initialValues);
52
- });
65
+ return;
53
66
  }
67
+ console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
68
+ initialValuesRef.current = initialValues;
69
+ setValues(function (prev) {
70
+ var merged = _extends({}, prev, initialValues);
71
+ if (isEqual(prev, merged)) {
72
+ return prev;
73
+ }
74
+ return merged;
75
+ });
54
76
  }, [initialValues]);
55
77
 
56
78
  // 优化 setFieldValue
@@ -13,7 +13,8 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
13
13
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
14
14
  var _window$React = window.React,
15
15
  createElement = _window$React.createElement,
16
- useCallback = _window$React.useCallback;
16
+ useCallback = _window$React.useCallback,
17
+ useMemo = _window$React.useMemo;
17
18
 
18
19
  /**
19
20
  * 按路径在树形 dataSource 上逐级匹配,取出每一层的 label(2 级、3 级…任意多级,长度由 pathValues 决定)。
@@ -101,7 +102,8 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
101
102
  disabledProp = props.disabled,
102
103
  _schemaValue = props.value,
103
104
  schemaOnChange = props.onChange,
104
- defaultValue = props.defaultValue;
105
+ defaultValue = props.defaultValue,
106
+ multiple = props.multiple;
105
107
  var _resolveProScreenBind = (0, _utils.resolveProScreenBinding)({
106
108
  screen_structure: screen_structure,
107
109
  screen_structure_field: screen_structure_field,
@@ -119,12 +121,26 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
119
121
  commit(next);
120
122
  schemaOnChange === null || schemaOnChange === void 0 ? void 0 : schemaOnChange(next, structureName, structureField);
121
123
  };
124
+
125
+ /** 表单/接口:完整路径 string[],如 ['2974','2975'] */
122
126
  var displayValue = normalizeCascaderPath(value);
123
127
 
124
128
  /**
125
- * Fusion 单选 getSingleData 对数组 value 只会用 value[0] 查节点,输入框文案不完整。
126
- * 表单存全路径 [省,市,区,...] 任意多级时,用 dataSource 拼「一级 / 二级 / …」。
129
+ * Fusion 单选:官方约定受控 value string[] | number[],且实现里只对数组取 value[0] 再查节点。
130
+ * 若传入完整路径 [父,子],会把「父」当成选中项,文案只有一级。
131
+ * 组件展示应传「叶子」单元素数组 [leaf],内部 getLabelPath(叶子节点) 会生成多级展示。
132
+ * 多选仍传 Fusion 所需的多个 value(与表单存值一致)。
127
133
  */
134
+ var valueForFusion = useMemo(function () {
135
+ var path = displayValue;
136
+ if (multiple) {
137
+ return path;
138
+ }
139
+ if (path.length === 0) return [];
140
+ return [path[path.length - 1]];
141
+ }, [displayValue, multiple]);
142
+
143
+ /** dataSource 未就绪或异步时,仍用自定义文案兜底 */
128
144
  var schemaDisplayRender = props.displayRender;
129
145
  var pathDisplayRender = useCallback(function (labels, data) {
130
146
  var fullLabels = resolvePathLabels(dataSource, normalizeCascaderPath(value));
@@ -142,7 +158,7 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
142
158
  readOnly: disableEdit ? true : readOnlyProp,
143
159
  disabled: disabledProp,
144
160
  dataSource: dataSource,
145
- value: displayValue,
161
+ value: valueForFusion,
146
162
  onChange: handleChange,
147
163
  displayRender: pathDisplayRender
148
164
  })));
@@ -48,15 +48,37 @@ var FormProvider = exports.FormProvider = function FormProvider(_ref) {
48
48
  values = _useState[0],
49
49
  setValues = _useState[1];
50
50
 
51
- // 仅当 initialValues 引用变化时更新状态
51
+ /** 每次渲染同步,供 initialValues effect 判断「store 是否只是回灌了当前表单已有数据」 */
52
+ var valuesRef = useRef(values);
53
+ valuesRef.current = values;
54
+
55
+ /**
56
+ * store 每次 dispatch 都会给新的 screenStructures 引用;若内容与表单 state 实际一致仍 setValues,
57
+ * 会整页重渲染(含 EditProTable、ss_xxx_tab 等大表),Fusion Overlay/Select 反复 setPosition,
58
+ * 易触发 React #185(Maximum update depth exceeded)。
59
+ *
60
+ * 仅与 initialValuesRef 比较不够:用户改字段后 onChange 已把同一份数据写回 store,若此时再 merge,
61
+ * 或与内表 mutate 的 window.screenStructures 产生细微差异,会反复 setValues 形成环。
62
+ * 因此:initialValues 与当前表单 values 深度相等时,一律不再 setValues。
63
+ */
52
64
  useEffect(function () {
53
- if (!(0, _lodash.isEqual)(initialValues, initialValuesRef.current)) {
54
- console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
65
+ if ((0, _lodash.isEqual)(initialValues, valuesRef.current)) {
66
+ initialValuesRef.current = initialValues;
67
+ return;
68
+ }
69
+ if ((0, _lodash.isEqual)(initialValues, initialValuesRef.current)) {
55
70
  initialValuesRef.current = initialValues;
56
- setValues(function (prev) {
57
- return (0, _extends2["default"])({}, prev, initialValues);
58
- });
71
+ return;
59
72
  }
73
+ console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
74
+ initialValuesRef.current = initialValues;
75
+ setValues(function (prev) {
76
+ var merged = (0, _extends2["default"])({}, prev, initialValues);
77
+ if ((0, _lodash.isEqual)(prev, merged)) {
78
+ return prev;
79
+ }
80
+ return merged;
81
+ });
60
82
  }, [initialValues]);
61
83
 
62
84
  // 优化 setFieldValue
@@ -101,7 +101,7 @@ function fillRealVersion(meta, packageName, version, basicLibraryVersion) {
101
101
  packageName = '@openli1115/lowcode-edit-pro-table';
102
102
  }
103
103
  if (version === void 0) {
104
- version = '1.0.61';
104
+ version = '1.0.63';
105
105
  }
106
106
  if (basicLibraryVersion === void 0) {
107
107
  basicLibraryVersion = {
@@ -106,7 +106,7 @@ function fillRealVersion(meta, packageName, version, basicLibraryVersion) {
106
106
  packageName = '@openli1115/lowcode-edit-pro-table';
107
107
  }
108
108
  if (version === void 0) {
109
- version = '1.0.61';
109
+ version = '1.0.63';
110
110
  }
111
111
  if (basicLibraryVersion === void 0) {
112
112
  basicLibraryVersion = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openli1115/lowcode-edit-pro-table",
3
- "version": "1.0.61",
3
+ "version": "1.0.63",
4
4
  "description": "@openli1115/lowcode-edit-pro-table",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -101,10 +101,10 @@
101
101
  },
102
102
  "componentConfig": {
103
103
  "isComponentLibrary": true,
104
- "materialSchema": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.61/build/lowcode/assets-prod.json"
104
+ "materialSchema": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.63/build/lowcode/assets-prod.json"
105
105
  },
106
106
  "lcMeta": {
107
107
  "type": "component"
108
108
  },
109
- "homepage": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.61/build/index.html"
109
+ "homepage": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.63/build/index.html"
110
110
  }