@openli1115/lowcode-edit-pro-table 1.0.68 → 1.0.71

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,8 +8,7 @@ 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,
12
- useMemo = _window$React.useMemo;
11
+ useCallback = _window$React.useCallback;
13
12
 
14
13
  /**
15
14
  * 按路径在树形 dataSource 上逐级匹配,取出每一层的 label(2 级、3 级…任意多级,长度由 pathValues 决定)。
@@ -97,8 +96,7 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
97
96
  disabledProp = props.disabled,
98
97
  _schemaValue = props.value,
99
98
  schemaOnChange = props.onChange,
100
- defaultValue = props.defaultValue,
101
- multiple = props.multiple;
99
+ defaultValue = props.defaultValue;
102
100
  var _resolveProScreenBind = resolveProScreenBinding({
103
101
  screen_structure: screen_structure,
104
102
  screen_structure_field: screen_structure_field,
@@ -116,26 +114,12 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
116
114
  commit(next);
117
115
  schemaOnChange === null || schemaOnChange === void 0 ? void 0 : schemaOnChange(next, structureName, structureField);
118
116
  };
119
-
120
- /** 表单/接口:完整路径 string[],如 ['2974','2975'] */
121
117
  var displayValue = normalizeCascaderPath(value);
122
118
 
123
119
  /**
124
- * Fusion 单选:官方约定受控 value string[] | number[],且实现里只对数组取 value[0] 再查节点。
125
- * 若传入完整路径 [父,子],会把「父」当成选中项,文案只有一级。
126
- * 组件展示应传「叶子」单元素数组 [leaf],内部 getLabelPath(叶子节点) 会生成多级展示。
127
- * 多选仍传 Fusion 所需的多个 value(与表单存值一致)。
120
+ * Fusion 单选 getSingleData 对数组 value 只会用 value[0] 查节点,输入框文案不完整。
121
+ * 表单存全路径 [省,市,区,...] 任意多级时,用 dataSource 拼「一级 / 二级 / …」。
128
122
  */
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 未就绪或异步时,仍用自定义文案兜底 */
139
123
  var schemaDisplayRender = props.displayRender;
140
124
  var pathDisplayRender = useCallback(function (labels, data) {
141
125
  var fullLabels = resolvePathLabels(dataSource, normalizeCascaderPath(value));
@@ -153,7 +137,7 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
153
137
  readOnly: disableEdit ? true : readOnlyProp,
154
138
  disabled: disabledProp,
155
139
  dataSource: dataSource,
156
- value: valueForFusion,
140
+ value: displayValue,
157
141
  onChange: handleChange,
158
142
  displayRender: pathDisplayRender
159
143
  })));
@@ -4,9 +4,5 @@ export declare function getFormContext(): any;
4
4
  export declare const FormProvider: React.FC<{
5
5
  initialValues?: Record<string, any>;
6
6
  onChange?: (values: Record<string, any>) => void;
7
- /** 由 preview 传入:最后一次 onChange(newStructures) 的引用;若与 initialValues 全等则本次为 store 回灌,勿再 merge(根治 #185) */
8
- lastOutboundStructuresRef?: {
9
- current: any;
10
- };
11
7
  children: React.ReactNode;
12
8
  }>;
@@ -33,7 +33,6 @@ export var FormProvider = function FormProvider(_ref) {
33
33
  var _ref$initialValues = _ref.initialValues,
34
34
  initialValues = _ref$initialValues === void 0 ? {} : _ref$initialValues,
35
35
  onChange = _ref.onChange,
36
- lastOutboundStructuresRef = _ref.lastOutboundStructuresRef,
37
36
  children = _ref.children;
38
37
  var FormContext = getFormContext();
39
38
 
@@ -43,51 +42,18 @@ export var FormProvider = function FormProvider(_ref) {
43
42
  values = _useState[0],
44
43
  setValues = _useState[1];
45
44
 
46
- /** 每次渲染同步,供 initialValues effect 判断「store 是否只是回灌了当前表单已有数据」 */
47
- var valuesRef = useRef(values);
48
- valuesRef.current = values;
49
-
50
- /**
51
- * store 每次 dispatch 都会给新的 screenStructures 引用;previewStore 直接把 onChange 的 payload 设为 state(同引用)。
52
- * 若 initialValues === 上次 handleFormChange 推出去的对象,说明只是「表单 → store → props」回灌,禁止再 merge,否则大表 + Fusion #185。
53
- * 逻辑流 / 接口改数会换对象引用,不会与 lastOutbound 全等。
54
- * 另:setFieldValue 会在微任务里 onChange,回灌前 lastOutbound 已同步为深拷贝对象;若 store 又克隆导致引用不一致,需用深比较兜底。
55
- */
45
+ // 仅当 initialValues 引用变化时更新状态
56
46
  useEffect(function () {
57
- if (lastOutboundStructuresRef && initialValues === lastOutboundStructuresRef.current) {
58
- initialValuesRef.current = initialValues;
59
- if (typeof console !== 'undefined' && console.debug) {
60
- console.debug('[FormProvider] skip merge (store ref === last outbound from form)');
61
- }
62
- return;
63
- }
64
- if (lastOutboundStructuresRef !== null && lastOutboundStructuresRef !== void 0 && lastOutboundStructuresRef.current && isEqual(initialValues, lastOutboundStructuresRef.current)) {
65
- initialValuesRef.current = initialValues;
66
- if (typeof console !== 'undefined' && console.debug) {
67
- console.debug('[FormProvider] skip merge (deep-equal to last outbound / store echo)');
68
- }
69
- return;
70
- }
71
- if (isEqual(initialValues, valuesRef.current)) {
47
+ if (!isEqual(initialValues, initialValuesRef.current)) {
48
+ console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
72
49
  initialValuesRef.current = initialValues;
73
- return;
50
+ setValues(function (prev) {
51
+ return _extends({}, prev, initialValues);
52
+ });
74
53
  }
75
- if (isEqual(initialValues, initialValuesRef.current)) {
76
- initialValuesRef.current = initialValues;
77
- return;
78
- }
79
- console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
80
- initialValuesRef.current = initialValues;
81
- setValues(function (prev) {
82
- var merged = _extends({}, prev, initialValues);
83
- if (isEqual(prev, merged)) {
84
- return prev;
85
- }
86
- return merged;
87
- });
88
54
  }, [initialValues]);
89
55
 
90
- // 优化 setFieldValue(lastOutbound 必须在 onChange 微任务之前写入,供 skip-merge 与 Fusion didUpdate 对齐)
56
+ // 优化 setFieldValue
91
57
  var setFieldValue = useCallback(function (path, value) {
92
58
  setValues(function (prev) {
93
59
  // 使用浅比较检查值是否实际变化
@@ -97,25 +63,17 @@ export var FormProvider = function FormProvider(_ref) {
97
63
  var newValues = cloneDeep(prev);
98
64
  set(newValues, path, value);
99
65
  console.log("[FormProvider] \uD83D\uDCDD Set field '" + path + "' to:", value);
100
- if (lastOutboundStructuresRef) {
101
- lastOutboundStructuresRef.current = newValues;
102
- }
66
+
67
+ // 触发 onChange 回调,把新值通知给外部
103
68
  if (onChange) {
69
+ // 使用微任务避免阻塞渲染
104
70
  Promise.resolve().then(function () {
105
- var rd = typeof window !== 'undefined' ? window.ReactDOM : undefined;
106
- var run = function run() {
107
- return onChange(newValues);
108
- };
109
- if (rd && typeof rd.unstable_batchedUpdates === 'function') {
110
- rd.unstable_batchedUpdates(run);
111
- } else {
112
- run();
113
- }
71
+ onChange(newValues);
114
72
  });
115
73
  }
116
74
  return newValues;
117
75
  });
118
- }, [onChange, lastOutboundStructuresRef]);
76
+ }, []);
119
77
 
120
78
  // 使用 useMemo 缓存 context 值
121
79
  var contextValue = useMemo(function () {
@@ -13,8 +13,7 @@ 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,
17
- useMemo = _window$React.useMemo;
16
+ useCallback = _window$React.useCallback;
18
17
 
19
18
  /**
20
19
  * 按路径在树形 dataSource 上逐级匹配,取出每一层的 label(2 级、3 级…任意多级,长度由 pathValues 决定)。
@@ -102,8 +101,7 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
102
101
  disabledProp = props.disabled,
103
102
  _schemaValue = props.value,
104
103
  schemaOnChange = props.onChange,
105
- defaultValue = props.defaultValue,
106
- multiple = props.multiple;
104
+ defaultValue = props.defaultValue;
107
105
  var _resolveProScreenBind = (0, _utils.resolveProScreenBinding)({
108
106
  screen_structure: screen_structure,
109
107
  screen_structure_field: screen_structure_field,
@@ -121,26 +119,12 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
121
119
  commit(next);
122
120
  schemaOnChange === null || schemaOnChange === void 0 ? void 0 : schemaOnChange(next, structureName, structureField);
123
121
  };
124
-
125
- /** 表单/接口:完整路径 string[],如 ['2974','2975'] */
126
122
  var displayValue = normalizeCascaderPath(value);
127
123
 
128
124
  /**
129
- * Fusion 单选:官方约定受控 value string[] | number[],且实现里只对数组取 value[0] 再查节点。
130
- * 若传入完整路径 [父,子],会把「父」当成选中项,文案只有一级。
131
- * 组件展示应传「叶子」单元素数组 [leaf],内部 getLabelPath(叶子节点) 会生成多级展示。
132
- * 多选仍传 Fusion 所需的多个 value(与表单存值一致)。
125
+ * Fusion 单选 getSingleData 对数组 value 只会用 value[0] 查节点,输入框文案不完整。
126
+ * 表单存全路径 [省,市,区,...] 任意多级时,用 dataSource 拼「一级 / 二级 / …」。
133
127
  */
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 未就绪或异步时,仍用自定义文案兜底 */
144
128
  var schemaDisplayRender = props.displayRender;
145
129
  var pathDisplayRender = useCallback(function (labels, data) {
146
130
  var fullLabels = resolvePathLabels(dataSource, normalizeCascaderPath(value));
@@ -158,7 +142,7 @@ var ProCascaderSelect = function ProCascaderSelect(props) {
158
142
  readOnly: disableEdit ? true : readOnlyProp,
159
143
  disabled: disabledProp,
160
144
  dataSource: dataSource,
161
- value: valueForFusion,
145
+ value: displayValue,
162
146
  onChange: handleChange,
163
147
  displayRender: pathDisplayRender
164
148
  })));
@@ -4,9 +4,5 @@ export declare function getFormContext(): any;
4
4
  export declare const FormProvider: React.FC<{
5
5
  initialValues?: Record<string, any>;
6
6
  onChange?: (values: Record<string, any>) => void;
7
- /** 由 preview 传入:最后一次 onChange(newStructures) 的引用;若与 initialValues 全等则本次为 store 回灌,勿再 merge(根治 #185) */
8
- lastOutboundStructuresRef?: {
9
- current: any;
10
- };
11
7
  children: React.ReactNode;
12
8
  }>;
@@ -39,7 +39,6 @@ var FormProvider = exports.FormProvider = function FormProvider(_ref) {
39
39
  var _ref$initialValues = _ref.initialValues,
40
40
  initialValues = _ref$initialValues === void 0 ? {} : _ref$initialValues,
41
41
  onChange = _ref.onChange,
42
- lastOutboundStructuresRef = _ref.lastOutboundStructuresRef,
43
42
  children = _ref.children;
44
43
  var FormContext = getFormContext();
45
44
 
@@ -49,51 +48,18 @@ var FormProvider = exports.FormProvider = function FormProvider(_ref) {
49
48
  values = _useState[0],
50
49
  setValues = _useState[1];
51
50
 
52
- /** 每次渲染同步,供 initialValues effect 判断「store 是否只是回灌了当前表单已有数据」 */
53
- var valuesRef = useRef(values);
54
- valuesRef.current = values;
55
-
56
- /**
57
- * store 每次 dispatch 都会给新的 screenStructures 引用;previewStore 直接把 onChange 的 payload 设为 state(同引用)。
58
- * 若 initialValues === 上次 handleFormChange 推出去的对象,说明只是「表单 → store → props」回灌,禁止再 merge,否则大表 + Fusion #185。
59
- * 逻辑流 / 接口改数会换对象引用,不会与 lastOutbound 全等。
60
- * 另:setFieldValue 会在微任务里 onChange,回灌前 lastOutbound 已同步为深拷贝对象;若 store 又克隆导致引用不一致,需用深比较兜底。
61
- */
51
+ // 仅当 initialValues 引用变化时更新状态
62
52
  useEffect(function () {
63
- if (lastOutboundStructuresRef && initialValues === lastOutboundStructuresRef.current) {
64
- initialValuesRef.current = initialValues;
65
- if (typeof console !== 'undefined' && console.debug) {
66
- console.debug('[FormProvider] skip merge (store ref === last outbound from form)');
67
- }
68
- return;
69
- }
70
- if (lastOutboundStructuresRef !== null && lastOutboundStructuresRef !== void 0 && lastOutboundStructuresRef.current && (0, _lodash.isEqual)(initialValues, lastOutboundStructuresRef.current)) {
71
- initialValuesRef.current = initialValues;
72
- if (typeof console !== 'undefined' && console.debug) {
73
- console.debug('[FormProvider] skip merge (deep-equal to last outbound / store echo)');
74
- }
75
- return;
76
- }
77
- if ((0, _lodash.isEqual)(initialValues, valuesRef.current)) {
53
+ if (!(0, _lodash.isEqual)(initialValues, initialValuesRef.current)) {
54
+ console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
78
55
  initialValuesRef.current = initialValues;
79
- return;
56
+ setValues(function (prev) {
57
+ return (0, _extends2["default"])({}, prev, initialValues);
58
+ });
80
59
  }
81
- if ((0, _lodash.isEqual)(initialValues, initialValuesRef.current)) {
82
- initialValuesRef.current = initialValues;
83
- return;
84
- }
85
- console.log('[FormProvider] 🔄 useEffect triggered - initialValues:', initialValues);
86
- initialValuesRef.current = initialValues;
87
- setValues(function (prev) {
88
- var merged = (0, _extends2["default"])({}, prev, initialValues);
89
- if ((0, _lodash.isEqual)(prev, merged)) {
90
- return prev;
91
- }
92
- return merged;
93
- });
94
60
  }, [initialValues]);
95
61
 
96
- // 优化 setFieldValue(lastOutbound 必须在 onChange 微任务之前写入,供 skip-merge 与 Fusion didUpdate 对齐)
62
+ // 优化 setFieldValue
97
63
  var setFieldValue = useCallback(function (path, value) {
98
64
  setValues(function (prev) {
99
65
  // 使用浅比较检查值是否实际变化
@@ -103,25 +69,17 @@ var FormProvider = exports.FormProvider = function FormProvider(_ref) {
103
69
  var newValues = (0, _lodash.cloneDeep)(prev);
104
70
  (0, _lodash.set)(newValues, path, value);
105
71
  console.log("[FormProvider] \uD83D\uDCDD Set field '" + path + "' to:", value);
106
- if (lastOutboundStructuresRef) {
107
- lastOutboundStructuresRef.current = newValues;
108
- }
72
+
73
+ // 触发 onChange 回调,把新值通知给外部
109
74
  if (onChange) {
75
+ // 使用微任务避免阻塞渲染
110
76
  Promise.resolve().then(function () {
111
- var rd = typeof window !== 'undefined' ? window.ReactDOM : undefined;
112
- var run = function run() {
113
- return onChange(newValues);
114
- };
115
- if (rd && typeof rd.unstable_batchedUpdates === 'function') {
116
- rd.unstable_batchedUpdates(run);
117
- } else {
118
- run();
119
- }
77
+ onChange(newValues);
120
78
  });
121
79
  }
122
80
  return newValues;
123
81
  });
124
- }, [onChange, lastOutboundStructuresRef]);
82
+ }, []);
125
83
 
126
84
  // 使用 useMemo 缓存 context 值
127
85
  var contextValue = useMemo(function () {
@@ -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.68';
104
+ version = '1.0.71';
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.68';
109
+ version = '1.0.71';
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.68",
3
+ "version": "1.0.71",
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.68/build/lowcode/assets-prod.json"
104
+ "materialSchema": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.71/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.68/build/index.html"
109
+ "homepage": "https://unpkg.com/@openli1115/lowcode-edit-pro-table@1.0.71/build/index.html"
110
110
  }