From bbccd9496ad85c947c862b96c453d76c79753897 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 1 Oct 2025 13:01:42 +0400 Subject: [PATCH] Improve resetFromString by adding option to skip view updates (#6617) --- packages/core/src/dom_components/model/Components.ts | 2 +- packages/core/src/dom_components/model/types.ts | 6 +++++- packages/core/src/dom_components/view/ComponentView.ts | 5 +++-- .../core/src/dom_components/view/ComponentsView.ts | 10 ++++++---- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/core/src/dom_components/model/Components.ts b/packages/core/src/dom_components/model/Components.ts index 8e6253c02..10178e0c6 100644 --- a/packages/core/src/dom_components/model/Components.ts +++ b/packages/core/src/dom_components/model/Components.ts @@ -164,7 +164,7 @@ Component> { const cssc = em?.Css; const allByID = domc?.allById() || {}; const parsed = this.parseString(input, opts); - const newCmps = getComponentsFromDefs(parsed, allByID, opts); + const newCmps = getComponentsFromDefs(parsed, allByID, { skipViewUpdate: true, ...opts }); const { visitedCmps = {} } = opts; // Clone styles for duplicated components diff --git a/packages/core/src/dom_components/model/types.ts b/packages/core/src/dom_components/model/types.ts index 84e7cc7ce..ad3b01a15 100644 --- a/packages/core/src/dom_components/model/types.ts +++ b/packages/core/src/dom_components/model/types.ts @@ -19,7 +19,11 @@ export type DraggableDroppableFn = (source: Component, target: Component, index? export interface AddComponentsOption extends AddOptions, OptionAsDocument {} -export interface ResetComponentsOptions extends AddComponentsOption { +export interface UpdateComponentsOptions extends AddComponentsOption { + skipViewUpdate?: boolean; +} + +export interface ResetComponentsOptions extends UpdateComponentsOptions { previousModels?: Component[]; keepIds?: string[]; skipDomReset?: boolean; diff --git a/packages/core/src/dom_components/view/ComponentView.ts b/packages/core/src/dom_components/view/ComponentView.ts index 2e6d2d1a1..0a8341769 100644 --- a/packages/core/src/dom_components/view/ComponentView.ts +++ b/packages/core/src/dom_components/view/ComponentView.ts @@ -11,7 +11,7 @@ import { setViewEl } from '../../utils/mixins'; import { DomComponentsConfig } from '../config/config'; import Component, { avoidInline } from '../model/Component'; import Components from '../model/Components'; -import { ComponentOptions } from '../model/types'; +import { ComponentOptions, UpdateComponentsOptions } from '../model/types'; import ComponentsView from './ComponentsView'; import { ComponentsEvents } from '../types'; @@ -570,7 +570,8 @@ TComp> { } } - renderAttributes() { + renderAttributes(m?: any, v?: any, opts: UpdateComponentsOptions = {}) { + if (opts.skipViewUpdate) return; this.updateAttributes(); this.updateClasses(); } diff --git a/packages/core/src/dom_components/view/ComponentsView.ts b/packages/core/src/dom_components/view/ComponentsView.ts index 7daf853b3..3b0b276fd 100644 --- a/packages/core/src/dom_components/view/ComponentsView.ts +++ b/packages/core/src/dom_components/view/ComponentsView.ts @@ -1,14 +1,14 @@ import { isUndefined } from 'underscore'; -import { removeEl } from '../../utils/dom'; +import FrameView from '../../canvas/view/FrameView'; import { View } from '../../common'; -import { DomComponentsConfig } from '../config/config'; import EditorModel from '../../editor/model/Editor'; +import { removeEl } from '../../utils/dom'; +import { DomComponentsConfig } from '../config/config'; import Component from '../model/Component'; -import ComponentView from './ComponentView'; -import FrameView from '../../canvas/view/FrameView'; import Components from '../model/Components'; import { ResetComponentsOptions } from '../model/types'; import { ComponentsEvents } from '../types'; +import ComponentView from './ComponentView'; export default class ComponentsView extends View { opts!: any; @@ -127,6 +127,8 @@ export default class ComponentsView extends View { } resetChildren(models: Components, opts: ResetComponentsOptions = {}) { + if (opts.skipViewUpdate) return; + const { previousModels } = opts; if (!opts.skipDomReset) { this.parentEl!.innerHTML = '';