158 文字
1 分

Reactでrefをマージする

2024-04-25

UI ライブラリなどを React で作成していると、Props から受け取った ref を内部的な ref とマージしたくなることがある。 次のようなコードを書けばいい。

import { useMemo } from "react";
export type ReactRef<T> = React.RefCallback<T> | React.MutableRefObject<T>;
export function assignRef<T = unknown>(
ref: ReactRef<T> | null | undefined,
value: T
) {
if (ref === null || ref === undefined) return;
if (typeof ref === "function") {
ref(value);
return;
}
try {
ref.current = value;
} catch (error) {
throw new Error(`Cannot assign value '${value}' to ref '${ref}'`);
}
}
export function mergeRefs<T>(...refs: (ReactRef<T> | null | undefined)[]) {
return (node: T | null) => {
refs.forEach((ref) => {
assignRef(ref, node);
});
};
}
export function useMergeRefs<T>(...refs: (ReactRef<T> | null | undefined)[]) {
return useMemo(() => mergeRefs(...refs), refs);
}
Reactでrefをマージする
https://blog.ohirunewani.com/posts/merge-refs-in-react/
作者
hrdtbs
公開日
2024-04-25
ライセンス
CC BY-NC-SA 4.0