fix(assigned-field): prevent deep cloning of React elements in scope (#7086)

* fix(assigned-field): prevent deep cloning of React elements in scope

* fix: simplify variable value assignment in action props
This commit is contained in:
Zeke Zhang 2025-06-18 19:30:27 +08:00 committed by GitHub
parent cca6b0faaf
commit 544f561b26
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 20 deletions

View File

@ -197,9 +197,7 @@ export function useCollectValuesToSubmit() {
if (isVariable(value)) {
const { value: parsedValue } = (await variables?.parseVariable(value, localVariables)) || {};
if (parsedValue !== null && parsedValue !== undefined) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
} else if (value !== '') {
assignedValues[key] = value;
}
@ -385,9 +383,7 @@ export const useAssociationCreateActionProps = () => {
if (isVariable(value)) {
const { value: parsedValue } = (await variables?.parseVariable(value, localVariables)) || {};
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
} else if (value !== '') {
assignedValues[key] = value;
}
@ -658,9 +654,7 @@ export const useCustomizeUpdateActionProps = () => {
if (isVariable(value)) {
const { value: parsedValue } = (await variables?.parseVariable(value, localVariables)) || {};
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
} else if (value !== '') {
assignedValues[key] = value;
}
@ -771,9 +765,7 @@ export const useCustomizeBulkUpdateActionProps = () => {
if (isVariable(value)) {
const { value: parsedValue } = (await variables?.parseVariable(value, localVariables)) || {};
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
} else if (value !== '') {
assignedValues[key] = value;
}
@ -999,9 +991,7 @@ export const useUpdateActionProps = () => {
if (isVariable(value)) {
const { value: parsedValue } = (await variables?.parseVariable(value, localVariables)) || {};
if (parsedValue) {
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
}
assignedValues[key] = transformVariableValue(parsedValue, { targetCollectionField: collectionField });
} else if (value !== '') {
assignedValues[key] = value;
}

View File

@ -10,8 +10,9 @@
import { Field } from '@formily/core';
import { useField, useFieldSchema } from '@formily/react';
import { merge } from '@formily/shared';
import _ from 'lodash';
import React, { useCallback, useEffect, useMemo } from 'react';
import _, { cloneDeepWith } from 'lodash';
import React, { isValidElement, useCallback, useEffect, useMemo } from 'react';
import { useBlockContext } from '../../../block-provider';
import { useFormBlockContext } from '../../../block-provider/FormBlockProvider';
import {
useCollectionField_deprecated,
@ -20,14 +21,13 @@ import {
useCollection_deprecated,
} from '../../../collection-manager';
import { CollectionFieldProvider } from '../../../data-source';
import { FlagProvider } from '../../../flag-provider';
import { useRecord } from '../../../record-provider';
import { useCompile, useComponent } from '../../../schema-component';
import { VariableInput, getShouldChange } from '../../../schema-settings/VariableInput/VariableInput';
import { Option } from '../../../schema-settings/VariableInput/type';
import { formatVariableScop } from '../../../schema-settings/VariableInput/utils/formatVariableScop';
import { useLocalVariables, useVariables } from '../../../variables';
import { useBlockContext } from '../../../block-provider';
import { FlagProvider } from '../../../flag-provider';
interface AssignedFieldProps {
value: any;
onChange: (value: any) => void;
@ -126,7 +126,14 @@ export const AssignedFieldInner = (props: AssignedFieldProps) => {
currentForm.children = formatVariableScop(currentFormFields);
}
return scope;
return cloneDeepWith(scope, (value) => {
// 不对 `ReactElement` 进行深拷贝,因为会报错
if (isValidElement(value)) {
return value;
}
// 对于其他类型的对象,继续正常的深拷贝
return undefined;
});
},
[currentFormFields, name],
);