Skip to content

Commit 8f795a8

Browse files
authored
[utils] Fix usePreviousValue equality comparison (#5264)
1 parent ee38be3 commit 8f795a8

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

packages/utils/src/usePreviousValue.test.tsx

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,56 @@ describe('usePrevious', () => {
7474
expect(previousValue).toBe(true);
7575
});
7676

77+
it('should treat NaN as unchanged', () => {
78+
let previousValue: any;
79+
const { setProps } = render(
80+
<TestComponent value={Number.NaN}>
81+
{(previous) => {
82+
previousValue = previous;
83+
return null;
84+
}}
85+
</TestComponent>,
86+
);
87+
88+
expect(previousValue).toBe(null);
89+
90+
setProps({ value: Number.NaN, unrelatedProp: 1 });
91+
expect(previousValue).toBe(null);
92+
});
93+
94+
it('should return the previous value when changing to NaN', () => {
95+
let previousValue: any;
96+
const { setProps } = render(
97+
<TestComponent value={1}>
98+
{(previous) => {
99+
previousValue = previous;
100+
return null;
101+
}}
102+
</TestComponent>,
103+
);
104+
105+
setProps({ value: Number.NaN });
106+
expect(previousValue).toBe(1);
107+
});
108+
109+
it('should distinguish positive and negative zero', () => {
110+
let previousValue: any;
111+
const { setProps } = render(
112+
<TestComponent value={0}>
113+
{(previous) => {
114+
previousValue = previous;
115+
return null;
116+
}}
117+
</TestComponent>,
118+
);
119+
120+
setProps({ value: -0 });
121+
expect(previousValue).toBe(0);
122+
123+
setProps({ value: 0 });
124+
expect(previousValue).toBe(-0);
125+
});
126+
77127
it('should ignore renders where the value does not change', () => {
78128
let previousValue: any;
79129
const { setProps } = render(

packages/utils/src/usePreviousValue.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export function usePreviousValue<T>(value: T): T | null {
1212
previous: null,
1313
});
1414

15-
if (value !== state.current) {
15+
if (!Object.is(value, state.current)) {
1616
setState({ current: value, previous: state.current });
1717
}
1818

0 commit comments

Comments
 (0)