| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import type { ObjectDirective } from '@vue/runtime-core'
- export const vShowOriginalDisplay: unique symbol = Symbol('_vod')
- export const vShowHidden: unique symbol = Symbol('_vsh')
- export interface VShowElement extends HTMLElement {
- // _vod = vue original display
- [vShowOriginalDisplay]?: string
- [vShowHidden]?: boolean
- }
- export const vShow: ObjectDirective<VShowElement> & { name?: 'show' } = {
- beforeMount(el, { value }, { transition }) {
- el[vShowOriginalDisplay] =
- el.style.display === 'none' ? '' : el.style.display
- if (transition && value) {
- transition.beforeEnter(el)
- } else {
- setDisplay(el, value)
- }
- },
- mounted(el, { value }, { transition }) {
- if (transition && value) {
- transition.enter(el)
- }
- },
- updated(el, { value, oldValue }, { transition }) {
- if (!value === !oldValue) return
- if (transition) {
- if (value) {
- transition.beforeEnter(el)
- setDisplay(el, true)
- transition.enter(el)
- } else {
- transition.leave(el, () => {
- setDisplay(el, false)
- })
- }
- } else {
- setDisplay(el, value)
- }
- },
- beforeUnmount(el, { value }) {
- setDisplay(el, value)
- },
- }
- if (__DEV__) {
- vShow.name = 'show'
- }
- function setDisplay(el: VShowElement, value: unknown): void {
- el.style.display = value ? el[vShowOriginalDisplay]! : 'none'
- el[vShowHidden] = !value
- }
- // SSR vnode transforms, only used when user includes client-oriented render
- // function in SSR
- export function initVShowForSSR(): void {
- vShow.getSSRProps = ({ value }) => {
- if (!value) {
- return { style: { display: 'none' } }
- }
- }
- }
|