once.spec.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. })