vShow.ts 606 B

1234567891011121314151617181920212223
  1. import type { ObjectDirective } from '../directive'
  2. const vShowMap = new WeakMap<HTMLElement, string>()
  3. export const vShow: ObjectDirective<HTMLElement> = {
  4. beforeMount(node, { value }) {
  5. vShowMap.set(node, node.style.display === 'none' ? '' : node.style.display)
  6. setDisplay(node, value)
  7. },
  8. updated(node, { value, oldValue }) {
  9. if (!value === !oldValue) return
  10. setDisplay(node, value)
  11. },
  12. beforeUnmount(node, { value }) {
  13. setDisplay(node, value)
  14. },
  15. }
  16. function setDisplay(el: HTMLElement, value: unknown): void {
  17. el.style.display = value ? vShowMap.get(el)! : 'none'
  18. }