vShow.spec.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import {
  2. withDirectives,
  3. defineComponent,
  4. h,
  5. nextTick,
  6. VNode
  7. } from '@vue/runtime-core'
  8. import { render, vShow } from '@vue/runtime-dom'
  9. const withVShow = (node: VNode, exp: any) =>
  10. withDirectives(node, [[vShow, exp]])
  11. let root: any
  12. beforeEach(() => {
  13. root = document.createElement('div')
  14. })
  15. describe('runtime-dom: v-show directive', () => {
  16. test('should check show value is truthy', async () => {
  17. const component = defineComponent({
  18. data() {
  19. return { value: true }
  20. },
  21. render() {
  22. return [withVShow(h('div'), this.value)]
  23. }
  24. })
  25. render(h(component), root)
  26. const $div = root.querySelector('div')
  27. expect($div.style.display).toEqual('')
  28. })
  29. test('should check show value is falsy', async () => {
  30. const component = defineComponent({
  31. data() {
  32. return { value: false }
  33. },
  34. render() {
  35. return [withVShow(h('div'), this.value)]
  36. }
  37. })
  38. render(h(component), root)
  39. const $div = root.querySelector('div')
  40. expect($div.style.display).toEqual('none')
  41. })
  42. it('should update show value changed', async () => {
  43. const component = defineComponent({
  44. data() {
  45. return { value: true }
  46. },
  47. render() {
  48. return [withVShow(h('div'), this.value)]
  49. }
  50. })
  51. render(h(component), root)
  52. const $div = root.querySelector('div')
  53. const data = root._vnode.component.data
  54. expect($div.style.display).toEqual('')
  55. data.value = false
  56. await nextTick()
  57. expect($div.style.display).toEqual('none')
  58. data.value = {}
  59. await nextTick()
  60. expect($div.style.display).toEqual('')
  61. data.value = 0
  62. await nextTick()
  63. expect($div.style.display).toEqual('none')
  64. data.value = []
  65. await nextTick()
  66. expect($div.style.display).toEqual('')
  67. data.value = null
  68. await nextTick()
  69. expect($div.style.display).toEqual('none')
  70. data.value = '0'
  71. await nextTick()
  72. expect($div.style.display).toEqual('')
  73. data.value = undefined
  74. await nextTick()
  75. expect($div.style.display).toEqual('none')
  76. data.value = 1
  77. await nextTick()
  78. expect($div.style.display).toEqual('')
  79. })
  80. test('should respect display value in style attribute', async () => {
  81. const component = defineComponent({
  82. data() {
  83. return { value: true }
  84. },
  85. render() {
  86. return [
  87. withVShow(h('div', { style: { display: 'block' } }), this.value)
  88. ]
  89. }
  90. })
  91. render(h(component), root)
  92. const $div = root.querySelector('div')
  93. const data = root._vnode.component.data
  94. expect($div.style.display).toEqual('block')
  95. data.value = false
  96. await nextTick()
  97. expect($div.style.display).toEqual('none')
  98. data.value = true
  99. await nextTick()
  100. expect($div.style.display).toEqual('block')
  101. })
  102. })