feat(core): support v-show directive (#310)
This commit is contained in:
45
packages/runtime-dom/src/directives/vShow.ts
Normal file
45
packages/runtime-dom/src/directives/vShow.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { ObjectDirective } from '@vue/runtime-core'
|
||||
|
||||
interface VShowElement extends HTMLElement {
|
||||
// _vod = vue original display
|
||||
_vod: string
|
||||
}
|
||||
|
||||
export const vShow: ObjectDirective<VShowElement> = {
|
||||
beforeMount(el, { value }, { transition }) {
|
||||
el._vod = 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) {
|
||||
setDisplay(el, true)
|
||||
}
|
||||
}
|
||||
|
||||
function setDisplay(el: VShowElement, value: unknown): void {
|
||||
el.style.display = value ? el._vod : 'none'
|
||||
}
|
||||
@@ -68,6 +68,8 @@ export { withModifiers, withKeys } from './directives/vOn'
|
||||
// DOM-only components
|
||||
export { Transition, TransitionProps } from './components/Transition'
|
||||
|
||||
export { vShow } from './directives/vShow'
|
||||
|
||||
// re-export everything from core
|
||||
// h, Component, reactivity API, nextTick, flags & types
|
||||
export * from '@vue/runtime-core'
|
||||
|
||||
Reference in New Issue
Block a user