Blame view

天文台pc/tianwentai-ui/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.mjs 2.36 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
51
52
53
54
55
56
57
58
59
60
61
62
63
  "use client";
  import { jsx } from 'react/jsx-runtime';
  import * as React from 'react';
  import { useId, useMemo } from 'react';
  import { PresenceContext } from '../../context/PresenceContext.mjs';
  import { useConstant } from '../../utils/use-constant.mjs';
  import { PopChild } from './PopChild.mjs';
  
  const PresenceChild = ({ children, initial, isPresent, onExitComplete, custom, presenceAffectsLayout, mode, anchorX, anchorY, root }) => {
      const presenceChildren = useConstant(newChildrenMap);
      const id = useId();
      let isReusedContext = true;
      let context = useMemo(() => {
          isReusedContext = false;
          return {
              id,
              initial,
              isPresent,
              custom,
              onExitComplete: (childId) => {
                  presenceChildren.set(childId, true);
                  for (const isComplete of presenceChildren.values()) {
                      if (!isComplete)
                          return; // can stop searching when any is incomplete
                  }
                  onExitComplete && onExitComplete();
              },
              register: (childId) => {
                  presenceChildren.set(childId, false);
                  return () => presenceChildren.delete(childId);
              },
          };
      }, [isPresent, presenceChildren, onExitComplete]);
      /**
       * If the presence of a child affects the layout of the components around it,
       * we want to make a new context value to ensure they get re-rendered
       * so they can detect that layout change.
       */
      if (presenceAffectsLayout && isReusedContext) {
          context = { ...context };
      }
      useMemo(() => {
          presenceChildren.forEach((_, key) => presenceChildren.set(key, false));
      }, [isPresent]);
      /**
       * If there's no `motion` components to fire exit animations, we want to remove this
       * component immediately.
       */
      React.useEffect(() => {
          !isPresent &&
              !presenceChildren.size &&
              onExitComplete &&
              onExitComplete();
      }, [isPresent]);
      children = (jsx(PopChild, { pop: mode === "popLayout", isPresent: isPresent, anchorX: anchorX, anchorY: anchorY, root: root, children: children }));
      return (jsx(PresenceContext.Provider, { value: context, children: children }));
  };
  function newChildrenMap() {
      return new Map();
  }
  
  export { PresenceChild };
  //# sourceMappingURL=PresenceChild.mjs.map