Skip to content

Commit 5055ea7

Browse files
authored
feat(react): mergeRefs/useMergeRefs now supports destructors (#229)
Destructors for ref-functions added in React 19
1 parent 78116b0 commit 5055ea7

3 files changed

Lines changed: 20 additions & 6 deletions

File tree

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@
6262
"@testing-library/react": "^16.1.0",
6363
"@trivago/prettier-plugin-sort-imports": "^6.0.2",
6464
"@types/node": "^24.2.1",
65-
"@types/react": "^19.0.10",
66-
"@types/react-dom": "^19.0.4",
65+
"@types/react": "^19.2.14",
66+
"@types/react-dom": "^19.2.3",
6767
"better-commits": "^1.17.0",
6868
"eslint": "^9.35.0",
6969
"eslint-plugin-jsdoc": "^54.0.0",

src/react/merge-refs.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,26 @@ export function mergeRefs<T>(
1010
list: Array<Ref<T> | RefObject<T> | RefCallback<T> | null | undefined>,
1111
): Ref<T> {
1212
return (value: T) => {
13+
const destructors: VoidFunction[] = [];
14+
1315
for (const ref of list) {
1416
if (typeof ref === 'function') {
15-
ref(value);
17+
const destructor = ref(value);
18+
19+
if (destructor) {
20+
destructors.push(destructor);
21+
}
1622
} else if (ref) {
1723
ref.current = value;
1824
}
1925
}
26+
27+
if (destructors.length > 0) {
28+
return () => {
29+
for (const destructor of destructors) {
30+
destructor();
31+
}
32+
};
33+
}
2034
};
2135
}

0 commit comments

Comments
 (0)