wupengfei
2025-02-12 2d4a6ebe75599eaa51d5fb0f522dc9fa6825af00
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
<script lang="ts">
import { VNode } from 'vue';
import { portal } from './portal';
 
export default defineComponent({
  name: 'portal-container',
  props: {
    render: {
      type: Function as PropType<(open: Ref<boolean>, onClose?: () => any) => VNode>,
    },
    keyNumber: {
      type: Number,
    },
    /**
     * 是否延迟设置open为true
     */
    delayOpen: {
      type: Boolean,
    },
  },
  setup(props, { slots }) {
    const open = ref(!props.delayOpen);
 
    function onClose() {
      open.value = false;
    }
 
    onMounted(() => {
      if (props.delayOpen) {
        setTimeout(() => {
          open.value = true;
        }, 30);
      }
    });
 
    watch(open, (open, preOpen) => {
      if (preOpen && !open) {
        setTimeout(() => {
          portal.remove(props.keyNumber);
        }, 300);
      }
    });
 
    return () => {
      //   const childrenNode = props.render(open, onClose);
      return slots.default?.({ open, onClose });
    };
  },
});
</script>