mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-02-28 21:20:28 +00:00
refactor(perf): 让 props 只构造一次, 降低复杂度且提高性能
This commit is contained in:
parent
17db25f53f
commit
1a107bc67a
@ -173,7 +173,7 @@ export class Node<Schema extends NodeSchema = NodeSchema> {
|
||||
this.props = new Props(this, props, extras);
|
||||
this._children = new NodeChildren(this as ParentalNode, this.initialChildren(children));
|
||||
this._children.internalInitParent();
|
||||
this.props.import(
|
||||
this.props.merge(
|
||||
this.upgradeProps(this.initProps(props || {})),
|
||||
this.upgradeProps(extras || {}),
|
||||
);
|
||||
|
||||
@ -218,6 +218,7 @@ export class Prop implements IPropParent {
|
||||
* set value, val should be JSON Object
|
||||
*/
|
||||
setValue(val: CompositeValue) {
|
||||
if (val === this._value) return;
|
||||
const editor = this.owner.document?.designer.editor;
|
||||
const oldValue = this._value;
|
||||
this._value = val;
|
||||
@ -231,7 +232,7 @@ export class Prop implements IPropParent {
|
||||
} else if (Array.isArray(val)) {
|
||||
this._type = 'list';
|
||||
} else if (isPlainObject(val)) {
|
||||
if (isJSSlot(val) && this.options.skipSetSlot !== true) {
|
||||
if (isJSSlot(val)) {
|
||||
this.setAsSlot(val);
|
||||
} else if (isJSExpression(val)) {
|
||||
this._type = 'expression';
|
||||
|
||||
@ -64,9 +64,9 @@ export class Props implements IPropParent {
|
||||
});
|
||||
if (Array.isArray(value)) {
|
||||
this.type = 'list';
|
||||
this.items = value.map(item => new Prop(this, item.value, item.name, item.spread, { skipSetSlot: true }));
|
||||
this.items = value.map(item => new Prop(this, item.value, item.name, item.spread));
|
||||
} else if (value != null) {
|
||||
this.items = Object.keys(value).map(key => new Prop(this, value[key], key, false, { skipSetSlot: true }));
|
||||
this.items = Object.keys(value).map(key => new Prop(this, value[key], key, false));
|
||||
}
|
||||
if (extras) {
|
||||
Object.keys(extras).forEach(key => {
|
||||
@ -96,10 +96,15 @@ export class Props implements IPropParent {
|
||||
originItems.forEach(item => item.purge());
|
||||
}
|
||||
|
||||
merge(value: PropsMap) {
|
||||
merge(value: PropsMap, extras?: PropsMap) {
|
||||
Object.keys(value).forEach(key => {
|
||||
this.query(key, true)!.setValue(value[key]);
|
||||
});
|
||||
if (extras) {
|
||||
Object.keys(extras).forEach(key => {
|
||||
this.query(getConvertedExtraKey(key), true)!.setValue(extras[key]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export(stage: TransformStage = TransformStage.Save): { props?: PropsMap | PropsList; extras?: object } {
|
||||
|
||||
@ -33,13 +33,13 @@ export function initNodeReducer(props, node) {
|
||||
// 2. 结构为 JSExpression 并且带有 events 字段
|
||||
if ((item.name === 'fieldId' && value) || (isJSExpression(value) && value.events)) {
|
||||
if (newProps[item.name] && !node.props.has(item.name)) {
|
||||
node.props.add(value, item.name, false, { skipSetSlot: true });
|
||||
node.props.add(value, item.name, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
newProps[item.name] = item.initial(node as any, newProps[item.name]);
|
||||
if (newProps[item.name] && !node.props.has(item.name)) {
|
||||
node.props.add(value, item.name, false, { skipSetSlot: true });
|
||||
node.props.add(value, item.name, false);
|
||||
}
|
||||
} catch (e) {
|
||||
if (hasOwnProperty(props, item.name)) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user