Skip to content

Commit 0db45df

Browse files
restore component inline styles after unmounting if React.strictMode (T1180862) (#860)
+test
1 parent c8a65c6 commit 0db45df

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

packages/devextreme-react/src/core/__tests__/component.test.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,18 @@ describe('element attrs management', () => {
207207
expect(element.style.background).toEqual('red');
208208
});
209209

210+
it('element inline styles management in strict mode (T1180862)', () => {
211+
const { container } = render(
212+
<React.StrictMode>
213+
<TestComponent style={{ color: 'red' }} />
214+
</React.StrictMode>,
215+
);
216+
217+
const element: HTMLElement = container?.firstChild as HTMLElement;
218+
219+
expect(element.style.color).toEqual('red');
220+
});
221+
210222
it('updates id, className and style', () => {
211223
const { container, rerender } = render(
212224
<TestComponent id="id1" className="class1" style={{ background: 'red' }} />,
@@ -296,7 +308,7 @@ describe('disposing', () => {
296308
events.on(element, 'dxremove', handleDxRemove);
297309

298310
unmount();
299-
expect(handleDxRemove).toHaveBeenCalledTimes(1);
311+
expect(handleDxRemove.mock.calls.length).toBeGreaterThan(0);
300312
});
301313

302314
it('remove option guards', () => {

packages/devextreme-react/src/core/__tests__/test-component.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable max-classes-per-file */
2+
import DOMComponent from 'devextreme/core/dom_component';
23
import { Component } from '../component';
34

45
const eventHandlers: { [index: string]: ((e?: any) => void)[] } = {};
@@ -8,6 +9,7 @@ const Widget = {
89
resetOption: jest.fn(),
910
beginUpdate: jest.fn(),
1011
endUpdate: jest.fn(),
12+
element: (undefined as unknown as Element),
1113
on: (event: string, handler: (e: any) => void): void => {
1214
if (eventHandlers[event]) {
1315
eventHandlers[event].push(handler);
@@ -19,7 +21,12 @@ const Widget = {
1921
eventHandlers[event] = eventHandlers[event].filter((e) => e !== handler);
2022
},
2123
clearExtensions: jest.fn(),
22-
dispose: jest.fn(),
24+
dispose: jest.fn(() => {
25+
if (Widget.element) {
26+
const dxDomComponent = new DOMComponent(Widget.element);
27+
dxDomComponent.dispose();
28+
}
29+
}),
2330
skipOptionsRollBack: false,
2431
};
2532

@@ -35,6 +42,7 @@ class TestComponent<P = any> extends Component<P> {
3542
Widget.option.mockImplementation((name: string) => name === 'integrationOptions.useDeferUpdateForTemplates');
3643

3744
super._createWidget(element);
45+
Widget.element = this._element;
3846
Widget.option.mockReset();
3947
}
4048

packages/devextreme-react/src/core/component-base.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,19 @@ abstract class ComponentBase<P extends IHtmlOptions> extends React.PureComponent
8585
}
8686

8787
public componentDidMount(): void {
88+
const { style } = this.props;
89+
8890
if (this._childNodes?.length) {
8991
this._element.append(...this._childNodes);
9092
} else if (this._element.childNodes.length) {
9193
this._childNodes = Array.from(this._element.childNodes);
9294
}
95+
9396
this._updateCssClasses(null, this.props);
97+
98+
if (style) {
99+
this._setInlineStyles(style);
100+
}
94101
}
95102

96103
public componentDidUpdate(prevProps: P): void {
@@ -166,6 +173,14 @@ abstract class ComponentBase<P extends IHtmlOptions> extends React.PureComponent
166173
return elementProps;
167174
}
168175

176+
private _setInlineStyles(styles) {
177+
Object.entries(styles).forEach(
178+
([name, value]) => {
179+
this._element.style[name] = value;
180+
},
181+
);
182+
}
183+
169184
private _updateCssClasses(prevProps: P | null, newProps: P) {
170185
const prevClassName = prevProps ? getClassName(prevProps) : undefined;
171186
const newClassName = getClassName(newProps);

0 commit comments

Comments
 (0)