once.spec.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import Vue from 'vue'
  2. describe('Directive v-once', () => {
  3. it('should not rerender component', done => {
  4. const vm = new Vue({
  5. template: '<div v-once>{{ a }}</div>',
  6. data: { a: 'hello' }
  7. }).$mount()
  8. expect(vm.$el.innerHTML).toBe('hello')
  9. vm.a = 'world'
  10. waitForUpdate(() => {
  11. expect(vm.$el.innerHTML).toBe('hello')
  12. }).then(done)
  13. })
  14. it('should not rerender self and child component', done => {
  15. const vm = new Vue({
  16. template: `<div v-once>
  17. <span>{{ a }}</span>
  18. <item :b="a"></item>
  19. </div>`,
  20. data: { a: 'hello' },
  21. components: {
  22. item: {
  23. template: '<div>{{ b }}</div>',
  24. props: ['b']
  25. }
  26. }
  27. }).$mount()
  28. expect(vm.$children.length).toBe(1)
  29. expect(vm.$el.innerHTML)
  30. .toBe('<span>hello</span> <div>hello</div>')
  31. vm.a = 'world'
  32. waitForUpdate(() => {
  33. expect(vm.$el.innerHTML)
  34. .toBe('<span>hello</span> <div>hello</div>')
  35. }).then(done)
  36. })
  37. it('should rerender parent but not self', done => {
  38. const vm = new Vue({
  39. template: `<div>
  40. <span>{{ a }}</span>
  41. <item v-once :b="a"></item>
  42. </div>`,
  43. data: { a: 'hello' },
  44. components: {
  45. item: {
  46. template: '<div>{{ b }}</div>',
  47. props: ['b']
  48. }
  49. }
  50. }).$mount()
  51. expect(vm.$children.length).toBe(1)
  52. expect(vm.$el.innerHTML)
  53. .toBe('<span>hello</span> <div>hello</div>')
  54. vm.a = 'world'
  55. waitForUpdate(() => {
  56. expect(vm.$el.innerHTML)
  57. .toBe('<span>world</span> <div>hello</div>')
  58. }).then(done)
  59. })
  60. it('should not rerender static sub nodes', done => {
  61. const vm = new Vue({
  62. template: `<div>
  63. <span v-once>{{ a }}</span>
  64. <item :b="a"></item>
  65. <span>{{ suffix }}</span>
  66. </div>`,
  67. data: {
  68. a: 'hello',
  69. suffix: '?'
  70. },
  71. components: {
  72. item: {
  73. template: '<div>{{ b }}</div>',
  74. props: ['b']
  75. }
  76. }
  77. }).$mount()
  78. expect(vm.$el.innerHTML)
  79. .toBe('<span>hello</span> <div>hello</div> <span>?</span>')
  80. vm.a = 'world'
  81. waitForUpdate(() => {
  82. expect(vm.$el.innerHTML)
  83. .toBe('<span>hello</span> <div>world</div> <span>?</span>')
  84. vm.suffix = '!'
  85. }).then(() => {
  86. expect(vm.$el.innerHTML)
  87. .toBe('<span>hello</span> <div>world</div> <span>!</span>')
  88. }).then(done)
  89. })
  90. it('should work with v-for', done => {
  91. const vm = new Vue({
  92. data: {
  93. list: [1, 2, 3]
  94. },
  95. template: `<div><div v-for="i in list" v-once>{{i}}</div></div>`
  96. }).$mount()
  97. expect(vm.$el.textContent).toBe('123')
  98. vm.list.reverse()
  99. waitForUpdate(() => {
  100. expect(vm.$el.textContent).toBe('123')
  101. }).then(done)
  102. })
  103. })