Skip to content

Commit 56516c8

Browse files
Template-renderer: fix template scheduled rendering (T1102789) (#747)
1 parent d6b7ddb commit 56516c8

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

packages/devextreme-react/src/core/__tests__/templates-renderer.test.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,30 @@ jest.mock('devextreme/core/utils/common', () => ({
8989
});
9090
});
9191
});
92+
93+
fdescribe('option update', () => {
94+
it('should call forceUpdateCallback and reset "updateScheduled" after forceUpdateCallback', async () => {
95+
const ref = React.createRef<TemplatesRenderer>();
96+
const templatesStore = new TemplatesStore(() => { });
97+
98+
deferUpdate.mockImplementation((func, _) => {
99+
func();
100+
});
101+
102+
render(<TemplatesRenderer templatesStore={templatesStore} ref={ref} />);
103+
104+
const current = ref.current!;
105+
const actualForceUpdateCallback = current.forceUpdateCallback;
106+
const spyForceUpdateCallback = jest.spyOn(current, 'forceUpdateCallback').mockImplementation(() => {
107+
expect((current as any).updateScheduled).toEqual(true);
108+
109+
actualForceUpdateCallback();
110+
111+
expect((current as any).updateScheduled).toEqual(false);
112+
});
113+
114+
current.scheduleUpdate(true);
115+
116+
expect(spyForceUpdateCallback).toHaveBeenCalledTimes(1);
117+
});
118+
});

packages/devextreme-react/src/core/templates-renderer.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { TemplatesStore } from './templates-store';
66

77
class TemplatesRenderer extends React.PureComponent<{ templatesStore: TemplatesStore }> {
88
private updateScheduled = false;
9-
109
private mounted = false;
1110

1211
componentDidMount(): void {
@@ -17,6 +16,10 @@ class TemplatesRenderer extends React.PureComponent<{ templatesStore: TemplatesS
1716
this.mounted = false;
1817
}
1918

19+
forceUpdateCallback = () => {
20+
this.updateScheduled = false;
21+
}
22+
2023
public scheduleUpdate(useDeferUpdate: boolean): void {
2124
if (this.updateScheduled) {
2225
return;
@@ -27,9 +30,8 @@ class TemplatesRenderer extends React.PureComponent<{ templatesStore: TemplatesS
2730
const updateFunc = useDeferUpdate ? deferUpdate : requestAnimationFrame;
2831
updateFunc(() => {
2932
if (this.mounted) {
30-
this.forceUpdate();
33+
this.forceUpdate(this.forceUpdateCallback);
3134
}
32-
3335
this.updateScheduled = false;
3436
});
3537
}

0 commit comments

Comments
 (0)