UNPKG

use-callback-ref

Version:
51 lines (50 loc) 2.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMergeRefs = void 0; var tslib_1 = require("tslib"); var React = tslib_1.__importStar(require("react")); var assignRef_1 = require("./assignRef"); var useRef_1 = require("./useRef"); var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect; var currentValues = new WeakMap(); /** * Merges two or more refs together providing a single interface to set their value * @param {RefObject|Ref} refs * @returns {MutableRefObject} - a new ref, which translates all changes to {refs} * * @see {@link mergeRefs} a version without buit-in memoization * @see https://github.com/theKashey/use-callback-ref#usemergerefs * @example * const Component = React.forwardRef((props, ref) => { * const ownRef = useRef(); * const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together * return <div ref={domRef}>...</div> * } */ function useMergeRefs(refs, defaultValue) { var callbackRef = (0, useRef_1.useCallbackRef)(defaultValue || null, function (newValue) { return refs.forEach(function (ref) { return (0, assignRef_1.assignRef)(ref, newValue); }); }); // handle refs changes - added or removed useIsomorphicLayoutEffect(function () { var oldValue = currentValues.get(callbackRef); if (oldValue) { var prevRefs_1 = new Set(oldValue); var nextRefs_1 = new Set(refs); var current_1 = callbackRef.current; prevRefs_1.forEach(function (ref) { if (!nextRefs_1.has(ref)) { (0, assignRef_1.assignRef)(ref, null); } }); nextRefs_1.forEach(function (ref) { if (!prevRefs_1.has(ref)) { (0, assignRef_1.assignRef)(ref, current_1); } }); } currentValues.set(callbackRef, refs); }, [refs]); return callbackRef; } exports.useMergeRefs = useMergeRefs;