feat: array/object setter support getValue & setValue

This commit is contained in:
mark.ck 2020-12-07 23:32:40 +08:00 committed by 力皓
parent bb4d200484
commit 3175745e5e
2 changed files with 24 additions and 11 deletions

View File

@ -20,11 +20,12 @@ interface ArraySetterProps {
itemSetter?: SetterType; itemSetter?: SetterType;
columns?: FieldConfig[]; columns?: FieldConfig[];
multiValue?: boolean; multiValue?: boolean;
onChange?: Function;
} }
export class ListSetter extends Component<ArraySetterProps, ArraySetterState> { export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
static getDerivedStateFromProps(props: ArraySetterProps, state: ArraySetterState) { static getDerivedStateFromProps(props: ArraySetterProps, state: ArraySetterState) {
const { value, field } = props; const { value, field, onChange } = props;
const newLength = value && Array.isArray(value) ? value.length : 0; const newLength = value && Array.isArray(value) ? value.length : 0;
if (state && state.prevLength === newLength) { if (state && state.prevLength === newLength) {
return null; return null;
@ -47,7 +48,9 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
setter: props.itemSetter, setter: props.itemSetter,
// FIXME: // FIXME:
forceInline: 1, forceInline: 1,
setValue: () => setTimeout(() => ListSetter.onItemChange(onChange, items)),
}); });
item.setValue(value[i]);
items[i] = item; items[i] = item;
itemsMap.set(item.id, item); itemsMap.set(item.id, item);
} }
@ -57,7 +60,7 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
itemsMap.delete(item.id); itemsMap.delete(item.id);
}); });
} }
ListSetter.onItemChange(onChange, items);
return { return {
items, items,
itemsMap, itemsMap,
@ -71,6 +74,13 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
prevLength: 0, prevLength: 0,
}; };
static onItemChange(onChange: Function|undefined, items: Array<SettingField>) {
onChange && onChange(items.map(item => {
return item && item.getValue();
}));
}
onSort(sortedIds: Array<string | number>) { onSort(sortedIds: Array<string | number>) {
const { itemsMap } = this.state; const { itemsMap } = this.state;
const { onChange, itemSetter, field } = this.props; const { onChange, itemSetter, field } = this.props;
@ -80,12 +90,8 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
return item; return item;
}); });
const values = items.map((item) => {
return item.getValue();
});
// 对itemsMap重新生成并刷新当前setter数据 // 对itemsMap重新生成并刷新当前setter数据
const newItems = []; const newItems: Array<SettingField> = [];
// const newItemsMap = {}; // const newItemsMap = {};
itemsMap.clear(); itemsMap.clear();
for (let i = 0; i < items.length; i++) { for (let i = 0; i < items.length; i++) {
@ -94,13 +100,14 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
setter: itemSetter, setter: itemSetter,
// FIXME: // FIXME:
forceInline: 1, forceInline: 1,
setValue: () => ListSetter.onItemChange(onChange, newItems),
}); });
newItems[i] = newItem; newItems[i] = newItem;
itemsMap.set(newItem.id, newItem); itemsMap.set(newItem.id, newItem);
} }
onChange(values); ListSetter.onItemChange(onChange, items);
this.setState({ this.setState({
items: newItems, items: newItems,
itemsMap, itemsMap,
@ -111,18 +118,20 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
onAdd() { onAdd() {
const { items, itemsMap } = this.state; const { items, itemsMap } = this.state;
const { itemSetter } = this.props; const { itemSetter, onChange } = this.props;
const initialValue = typeof itemSetter === 'object' ? (itemSetter as any).initialValue : null; const initialValue = typeof itemSetter === 'object' ? (itemSetter as any).initialValue : null;
const item = this.props.field.createField({ const item = this.props.field.createField({
name: items.length, name: items.length,
setter: itemSetter, setter: itemSetter,
// FIXME: // FIXME:
forceInline: 1, forceInline: 1,
setValue: () => ListSetter.onItemChange(onChange, items),
}); });
items.push(item); items.push(item);
itemsMap.set(item.id, item); itemsMap.set(item.id, item);
item.setValue(typeof initialValue === 'function' ? initialValue(item) : initialValue); item.setValue(typeof initialValue === 'function' ? initialValue(item) : initialValue);
this.scrollToLast = true; this.scrollToLast = true;
ListSetter.onItemChange(onChange, items);
this.setState({ this.setState({
items: items.slice(), items: items.slice(),
}); });
@ -147,7 +156,7 @@ export class ListSetter extends Component<ArraySetterProps, ArraySetterState> {
} }
itemsMap.delete(field.id); itemsMap.delete(field.id);
field.remove(); field.remove();
onChange(values); onChange && onChange(values);
this.setState({ items: items.slice() }); this.setState({ items: items.slice() });
} }

View File

@ -164,7 +164,11 @@ class FormSetter extends Component<FormSetterProps> {
constructor(props: RowSetterProps) { constructor(props: RowSetterProps) {
super(props); super(props);
const { config, field } = props; const { config, field } = props;
this.items = (config?.items || []).map((conf) => field.createField(conf)); const { extraProps } = field;
this.items = (config?.items || []).map((conf) => field.createField({
...conf,
setValue: extraProps?.setValue,
}));
// TODO: extraConfig for custom fields // TODO: extraConfig for custom fields
} }