@restart/hooks
Version:
A set of utility and general-purpose React hooks.
33 lines (32 loc) • 869 B
JavaScript
import { useMemo } from 'react';
const toFnRef = ref => !ref || typeof ref === 'function' ? ref : value => {
ref.current = value;
};
export function mergeRefs(refA, refB) {
const a = toFnRef(refA);
const b = toFnRef(refB);
return value => {
if (a) a(value);
if (b) b(value);
};
}
/**
* Create and returns a single callback ref composed from two other Refs.
*
* ```tsx
* const Button = React.forwardRef((props, ref) => {
* const [element, attachRef] = useCallbackRef<HTMLButtonElement>();
* const mergedRef = useMergedRefs(ref, attachRef);
*
* return <button ref={mergedRef} {...props}/>
* })
* ```
*
* @param refA A Callback or mutable Ref
* @param refB A Callback or mutable Ref
* @category refs
*/
function useMergedRefs(refA, refB) {
return useMemo(() => mergeRefs(refA, refB), [refA, refB]);
}
export default useMergedRefs;