Skip to content

Commit badd326

Browse files
jcfrancobenelan
authored andcommitted
refactor: use requestAnimationFrame to replace readTask (#10432)
**Related Issue:** #10348 ## Summary We've been using `readTask` in a few places to ensure proper timing for DOM reads w/o triggering layout thrashing. Looking at [the implementation](https://github.com/ionic-team/stencil/blob/7ede77a873486b5cf47f0b26571f852675f67dd6/src/client/client-task-queue.ts#L23), we might be able to get close or similar behavior by using `requestAnimationFrame`.
1 parent 9b94714 commit badd326

File tree

4 files changed

+8
-13
lines changed

4 files changed

+8
-13
lines changed

packages/calcite-components/src/components/stepper/stepper.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
State,
1212
VNode,
1313
Watch,
14-
readTask,
1514
} from "@stencil/core";
1615
import { focusElementInGroup, slotChangeGetAssignedElements } from "../../utils/dom";
1716
import { Position, Scale } from "../interfaces";
@@ -356,7 +355,7 @@ export class Stepper implements LocalizedComponent, T9nComponent {
356355

357356
@Watch("currentActivePosition")
358357
handlePositionChange(): void {
359-
readTask((): void => {
358+
requestAnimationFrame((): void => {
360359
this.determineActiveStepper();
361360
});
362361
}

packages/calcite-components/src/components/tab-nav/tab-nav.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
Host,
88
Listen,
99
Prop,
10-
readTask,
1110
State,
1211
VNode,
1312
Watch,
@@ -262,7 +261,7 @@ export class TabNav implements LocalizedComponent, T9nComponent {
262261
return;
263262
}
264263

265-
readTask(() => {
264+
requestAnimationFrame(() => {
266265
const isLTR = this.effectiveDir === "ltr";
267266
const tabTitleContainer = this.tabTitleContainerEl;
268267
const containerBounds = tabTitleContainer.getBoundingClientRect();
@@ -487,7 +486,7 @@ export class TabNav implements LocalizedComponent, T9nComponent {
487486
}
488487

489488
private scrollToTabTitles = (direction: "forward" | "backward"): void => {
490-
readTask(() => {
489+
requestAnimationFrame(() => {
491490
const tabTitleContainer = this.tabTitleContainerEl;
492491
const containerBounds = tabTitleContainer.getBoundingClientRect();
493492
const tabTitles = Array.from(this.el.querySelectorAll("calcite-tab-title"));

packages/calcite-components/src/utils/openCloseComponent.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ describe("openCloseComponent", () => {
99
let dispatchTransitionEvent: TransitionEventDispatcher;
1010

1111
beforeEach(() => {
12-
jest.spyOn(openCloseComponent, "internalReadTask").mockImplementation((task) => task(1337));
12+
jest.spyOn(global, "requestAnimationFrame").mockImplementation((cb) => {
13+
cb(0);
14+
return 0;
15+
});
1316
dispatchTransitionEvent = createTransitionEventDispatcher();
1417
});
1518

packages/calcite-components/src/utils/openCloseComponent.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
import { readTask } from "@stencil/core";
21
import { whenTransitionDone } from "./dom";
32

4-
/**
5-
* Exported for testing purposes only
6-
*/
7-
export const internalReadTask = readTask;
8-
93
/**
104
* Defines interface for components with open/close public emitter.
115
* All implementations of this interface must handle the following events: `beforeOpen`, `open`, `beforeClose`, `close`.
@@ -86,7 +80,7 @@ function isOpen(component: OpenCloseComponent): boolean {
8680
* @param component - OpenCloseComponent uses `open` prop to emit (before)open/close.
8781
*/
8882
export function onToggleOpenCloseComponent(component: OpenCloseComponent): void {
89-
internalReadTask((): void => {
83+
requestAnimationFrame((): void => {
9084
if (!component.transitionEl) {
9185
return;
9286
}

0 commit comments

Comments
 (0)