Skip to content

Commit 8ba0be1

Browse files
committed
fix(use-tracked): avoid re-render when there are multiple values
1 parent 91ad513 commit 8ba0be1

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

packages/use-tracked.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { useState } from 'react'
2-
import { ContextableStates } from 'packages/create'
1+
import useStateRef from './use-state-ref'
2+
import { ContextableStates } from './create'
33

44
const pickTrackedValues = <T extends ContextableStates>(values: T, keys: Array<keyof T>) => {
55
return Object.keys(values).reduce((pre, key) => {
@@ -13,16 +13,15 @@ const pickTrackedValues = <T extends ContextableStates>(values: T, keys: Array<k
1313

1414
const makeUseTracked = <T extends ContextableStates>(initialValues: T, eventName: string) => {
1515
return (trackingKeys: Array<keyof T>) => {
16-
const [selected, setSelected] = useState<{ [key in typeof trackingKeys[number]]: T[key] }>(() =>
17-
pickTrackedValues(initialValues, trackingKeys),
18-
)
16+
const [selected, setSelected, selectedRef] = useStateRef<
17+
{ [key in typeof trackingKeys[number]]: T[key] }
18+
>(() => pickTrackedValues(initialValues, trackingKeys))
1919

2020
if (typeof window !== 'undefined') {
2121
window.addEventListener(eventName, (event: CustomEvent<T>) => {
2222
const nextValue = event.detail
23-
const hasChanged = trackingKeys.some(key => {
24-
return selected[key] !== nextValue[key]
25-
})
23+
24+
const hasChanged = trackingKeys.some(key => selectedRef.current[key] !== nextValue[key])
2625
if (hasChanged) {
2726
setSelected(pickTrackedValues(nextValue, trackingKeys))
2827
}

0 commit comments

Comments
 (0)