edge-cases.spec.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import Vue from 'vue'
  2. describe('vdom patch: edge cases', () => {
  3. // exposed by #3406
  4. // When a static vnode is inside v-for, it's possible for the same vnode
  5. // to be used in multiple places, and its element will be replaced. This
  6. // causes patch errors when node ops depend on the vnode's element position.
  7. it('should handle static vnodes by key', done => {
  8. const vm = new Vue({
  9. data: {
  10. ok: true
  11. },
  12. template: `
  13. <div>
  14. <div v-for="i in 2">
  15. <div v-if="ok">a</div><div>b</div><div v-if="!ok">c</div><div>d</div>
  16. </div>
  17. </div>
  18. `
  19. }).$mount()
  20. expect(vm.$el.textContent).toBe('abdabd')
  21. vm.ok = false
  22. waitForUpdate(() => {
  23. expect(vm.$el.textContent).toBe('bcdbcd')
  24. }).then(done)
  25. })
  26. // #3533
  27. // a static node (<br>) is reused in createElm, which changes its elm reference
  28. // and is inserted into a different parent.
  29. // later when patching the next element a DOM insertion uses it as the
  30. // reference node, causing a parent mismatch.
  31. it('should handle static node edge case when it\'s reused AND used as a reference node for insertion', done => {
  32. const vm = new Vue({
  33. data: {
  34. ok: true
  35. },
  36. template: `
  37. <div>
  38. <button @click="ok = !ok">toggle</button>
  39. <div class="b" v-if="ok">123</div>
  40. <div class="c">
  41. <br><p>{{ 1 }}</p>
  42. </div>
  43. <div class="d">
  44. <label>{{ 2 }}</label>
  45. </div>
  46. </div>
  47. `
  48. }).$mount()
  49. expect(vm.$el.querySelector('.c').textContent).toBe('1')
  50. expect(vm.$el.querySelector('.d').textContent).toBe('2')
  51. vm.ok = false
  52. waitForUpdate(() => {
  53. expect(vm.$el.querySelector('.c').textContent).toBe('1')
  54. expect(vm.$el.querySelector('.d').textContent).toBe('2')
  55. }).then(done)
  56. })
  57. })