fix: dynamic component switching error
This commit is contained in:
parent
139ca9a635
commit
8113748f26
@ -1,6 +1,7 @@
|
|||||||
import { useField } from '@formily/react';
|
import { useField } from '@formily/react';
|
||||||
import { merge } from '@formily/shared';
|
import { merge } from '@formily/shared';
|
||||||
import flat from 'flat';
|
import flat from 'flat';
|
||||||
|
import cloneDeep from 'lodash/cloneDeep';
|
||||||
import get from 'lodash/get';
|
import get from 'lodash/get';
|
||||||
import { useContext, useEffect } from 'react';
|
import { useContext, useEffect } from 'react';
|
||||||
import { FilterContext, FilterLogicContext } from './context';
|
import { FilterContext, FilterLogicContext } from './context';
|
||||||
@ -35,7 +36,7 @@ export const useValues = () => {
|
|||||||
if (!path) {
|
if (!path) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const [fieldPath, otherPath] = path.split('.$');
|
const [fieldPath = '', otherPath = ''] = path.split('.$');
|
||||||
const [operatorValue] = otherPath.split('.', 2);
|
const [operatorValue] = otherPath.split('.', 2);
|
||||||
const dataIndex = fieldPath.split('.');
|
const dataIndex = fieldPath.split('.');
|
||||||
const option = findOption(dataIndex, options);
|
const option = findOption(dataIndex, options);
|
||||||
@ -57,7 +58,9 @@ export const useValues = () => {
|
|||||||
field.data = field.data || {};
|
field.data = field.data || {};
|
||||||
field.data.operators = option?.operators;
|
field.data.operators = option?.operators;
|
||||||
field.data.operator = operator;
|
field.data.operator = operator;
|
||||||
field.data.schema = merge(option?.schema, operator?.schema);
|
const s1 = cloneDeep(option?.schema);
|
||||||
|
const s2 = cloneDeep(operator?.schema);
|
||||||
|
field.data.schema = merge(s1, s2);
|
||||||
field.data.dataIndex = dataIndex;
|
field.data.dataIndex = dataIndex;
|
||||||
field.data.value = null;
|
field.data.value = null;
|
||||||
data2value();
|
data2value();
|
||||||
@ -65,7 +68,10 @@ export const useValues = () => {
|
|||||||
setOperator(operatorValue) {
|
setOperator(operatorValue) {
|
||||||
const operator = field.data?.operators?.find?.((item) => item.value === operatorValue);
|
const operator = field.data?.operators?.find?.((item) => item.value === operatorValue);
|
||||||
field.data.operator = operator;
|
field.data.operator = operator;
|
||||||
field.data.schema = merge(field.data.schema, operator.schema);
|
const option = findOption(field.data.dataIndex, options);
|
||||||
|
const s1 = cloneDeep(option?.schema);
|
||||||
|
const s2 = cloneDeep(operator?.schema);
|
||||||
|
field.data.schema = merge(s1, s2);
|
||||||
field.data.value = operator.noValue ? operator.default || true : null;
|
field.data.value = operator.noValue ? operator.default || true : null;
|
||||||
data2value();
|
data2value();
|
||||||
},
|
},
|
||||||
|
@ -69,9 +69,14 @@ const filterOption = (input, option) => (option?.label ?? '').toLowerCase().incl
|
|||||||
|
|
||||||
const InternalSelect = connect(
|
const InternalSelect = connect(
|
||||||
(props: Props) => {
|
(props: Props) => {
|
||||||
const { objectValue, ...others } = props;
|
const { objectValue, value, ...others } = props;
|
||||||
const mode = props.mode || props.multiple ? 'multiple' : undefined;
|
const mode = props.mode || props.multiple ? 'multiple' : undefined;
|
||||||
|
const toValue = (v) => {
|
||||||
|
if (['multiple', 'tags'].includes(mode)) {
|
||||||
|
return v || [];
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
};
|
||||||
if (objectValue) {
|
if (objectValue) {
|
||||||
return <ObjectSelect {...others} mode={mode} />;
|
return <ObjectSelect {...others} mode={mode} />;
|
||||||
}
|
}
|
||||||
@ -80,6 +85,7 @@ const InternalSelect = connect(
|
|||||||
showSearch
|
showSearch
|
||||||
filterOption={filterOption}
|
filterOption={filterOption}
|
||||||
allowClear
|
allowClear
|
||||||
|
value={toValue(value)}
|
||||||
{...others}
|
{...others}
|
||||||
onChange={(changed) => {
|
onChange={(changed) => {
|
||||||
props.onChange?.(changed === undefined ? null : changed);
|
props.onChange?.(changed === undefined ? null : changed);
|
||||||
|
Loading…
Reference in New Issue
Block a user