Blame view

天文台pc/tianwentai-ui/node_modules/use-callback-ref/dist/es5/useMergeRef.js 1.98 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  "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;