diff --git a/src/lib/teact/teact-dom.ts b/src/lib/teact/teact-dom.ts index 804fcd7d0..cee846d2b 100644 --- a/src/lib/teact/teact-dom.ts +++ b/src/lib/teact/teact-dom.ts @@ -19,6 +19,7 @@ import { unmountComponent, isFragmentElement, runImmediateEffects, + willRunImmediateEffects, } from './teact'; import { DEBUG } from '../../config'; import { addEventListener, removeAllDelegatedListeners, removeEventListener } from './dom-events'; @@ -57,7 +58,9 @@ function render($element: VirtualElement | undefined, parentEl: HTMLElement) { const $head = headsByElement.get(parentEl)!; const $newElement = renderWithVirtual(parentEl, $head.children[0], $element, $head, 0); - queueMicrotask(runImmediateEffects); + if (!willRunImmediateEffects()) { + runImmediateEffects(); + } $head.children = $newElement ? [$newElement] : []; diff --git a/src/lib/teact/teact.ts b/src/lib/teact/teact.ts index faca9b5d6..b83b4c989 100644 --- a/src/lib/teact/teact.ts +++ b/src/lib/teact/teact.ts @@ -307,8 +307,11 @@ let pendingEffects = new Map(); let pendingCleanups = new Map(); let pendingLayoutEffects = new Map(); let pendingLayoutCleanups = new Map(); +let areImmediateEffectsPending = false; const runUpdatePassOnRaf = throttleWithRafFallback(() => { + areImmediateEffectsPending = true; + idsToExcludeFromUpdate = new Set(); const instancesToUpdate = Array @@ -335,9 +338,14 @@ const runUpdatePassOnRaf = throttleWithRafFallback(() => { forceUpdateComponent(instance); }); + areImmediateEffectsPending = false; runImmediateEffects(); }); +export function willRunImmediateEffects() { + return areImmediateEffectsPending; +} + export function runImmediateEffects() { const currentLayoutCleanups = pendingLayoutCleanups; pendingLayoutCleanups = new Map();