/
popover.vue
109 lines (97 loc) 路 2.35 KB
/
popover.vue
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<template>
<el-tooltip
ref="tooltipRef"
v-bind="$attrs"
:trigger="trigger"
:placement="placement"
:disabled="disabled"
:visible="visible"
:transition="transition"
:popper-options="popperOptions"
:tabindex="tabindex"
:content="content"
:offset="offset"
:show-after="showAfter"
:hide-after="hideAfter"
:auto-close="autoClose"
:show-arrow="showArrow"
:aria-label="title"
:effect="effect"
:enterable="enterable"
:popper-class="kls"
:popper-style="style"
:teleported="teleported"
:persistent="persistent"
:gpu-acceleration="gpuAcceleration"
@before-show="beforeEnter"
@before-hide="beforeLeave"
@show="afterEnter"
@hide="afterLeave"
>
<template v-if="$slots.reference">
<slot name="reference" />
</template>
<template #content>
<div v-if="title" :class="ns.e('title')" role="title">
{{ title }}
</div>
<slot>
{{ content }}
</slot>
</template>
</el-tooltip>
</template>
<script lang="ts" setup>
import { computed, ref, unref } from 'vue'
import { ElTooltip } from '@element-plus/components/tooltip'
import { addUnit } from '@element-plus/utils'
import { useNamespace } from '@element-plus/hooks'
import { popoverEmits, popoverProps } from './popover'
import type { TooltipInstance } from '@element-plus/components/tooltip'
defineOptions({
name: 'ElPopover',
})
const props = defineProps(popoverProps)
const emit = defineEmits(popoverEmits)
const ns = useNamespace('popover')
const tooltipRef = ref<TooltipInstance>()
const popperRef = computed(() => {
return unref(tooltipRef)?.popperRef
})
const style = computed(() => {
return [
{
width: addUnit(props.width),
},
props.popperStyle!,
]
})
const kls = computed(() => {
return [ns.b(), props.popperClass!, { [ns.m('plain')]: !!props.content }]
})
const gpuAcceleration = computed(() => {
return props.transition === 'el-fade-in-linear'
})
const hide = () => {
tooltipRef.value?.hide()
}
const beforeEnter = () => {
emit('before-enter')
}
const beforeLeave = () => {
emit('before-leave')
}
const afterEnter = () => {
emit('after-enter')
}
const afterLeave = () => {
emit('update:visible', false)
emit('after-leave')
}
defineExpose({
/** @description popper ref */
popperRef,
/** @description hide popover */
hide,
})
</script>