Skip to content

Commit 16973e2

Browse files
committed
perf(Filter): add custom memo comparator to prevent unnecessary re-renders
1 parent 51c0e67 commit 16973e2

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

src/components/ProductTable/Filter.tsx

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,37 @@ interface FilterProps {
1414
onChange: (updatedFilter: FilterOption) => void
1515
}
1616

17+
const arePropsEqual = (prevProps: FilterProps, nextProps: FilterProps) => {
18+
if (prevProps.filterIndex !== nextProps.filterIndex) return false
19+
if (prevProps.filter.title !== nextProps.filter.title) return false
20+
if (prevProps.filter.showFilterOption !== nextProps.filter.showFilterOption)
21+
return false
22+
23+
const prevItems = prevProps.filter.items
24+
const nextItems = nextProps.filter.items
25+
26+
if (prevItems.length !== nextItems.length) return false
27+
28+
for (let i = 0; i < prevItems.length; i++) {
29+
const prevItem = prevItems[i]
30+
const nextItem = nextItems[i]
31+
32+
if (prevItem.filterKey !== nextItem.filterKey) return false
33+
if (prevItem.inputState !== nextItem.inputState) return false
34+
35+
if (prevItem.options.length !== nextItem.options.length) return false
36+
37+
for (let j = 0; j < prevItem.options.length; j++) {
38+
if (prevItem.options[j].filterKey !== nextItem.options[j].filterKey)
39+
return false
40+
if (prevItem.options[j].inputState !== nextItem.options[j].inputState)
41+
return false
42+
}
43+
}
44+
45+
return true
46+
}
47+
1748
const Filter = ({ filter, filterIndex, onChange }: FilterProps) => {
1849
const handleChange = (
1950
_: number,
@@ -110,4 +141,4 @@ const Filter = ({ filter, filterIndex, onChange }: FilterProps) => {
110141
)
111142
}
112143

113-
export default memo(Filter)
144+
export default memo(Filter, arePropsEqual)

0 commit comments

Comments
 (0)