ref.spec.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import Vue from 'vue'
  2. describe('Directive v-ref', () => {
  3. const components = {
  4. test: {
  5. id: 'test'
  6. },
  7. test2: {
  8. id: 'test2'
  9. }
  10. }
  11. it('should accept hyphenated refs', () => {
  12. const vm = new Vue({
  13. template: `<div>
  14. <test v-ref:test></test>
  15. <test2 v-ref:test-hyphen></test2>
  16. </div>`,
  17. components
  18. })
  19. vm.$mount()
  20. expect(vm.$refs.test).toBeTruthy()
  21. expect(vm.$refs.test.$options.id).toBe('test')
  22. expect(vm.$refs['test-hyphen']).toBeTruthy()
  23. expect(vm.$refs['test-hyphen'].$options.id).toBe('test2')
  24. })
  25. it('should accept camelCase refs', () => {
  26. const vm = new Vue({
  27. template:
  28. `<div>
  29. <test v-ref:test></test>
  30. <test2 v-ref:testCase></test2>
  31. </div>`,
  32. components
  33. })
  34. vm.$mount()
  35. expect(vm.$refs.test).toBeTruthy()
  36. expect(vm.$refs.test.$options.id).toBe('test')
  37. expect(vm.$refs.testCase).toBeTruthy()
  38. expect(vm.$refs.testCase.$options.id).toBe('test2')
  39. })
  40. it('should accept HOC component', () => {
  41. const vm = new Vue({
  42. template: '<test v-ref:test></test>',
  43. components
  44. })
  45. vm.$mount()
  46. expect(vm.$refs.test).toBeTruthy()
  47. expect(vm.$refs.test.$options.id).toBe('test')
  48. })
  49. it('should accept dynamic component', done => {
  50. const vm = new Vue({
  51. template: `<div>
  52. <component :is="test" v-ref:test></component>
  53. </div>`,
  54. components,
  55. data: { test: 'test' }
  56. })
  57. vm.$mount()
  58. expect(vm.$refs.test.$options.id).toBe('test')
  59. vm.test = 'test2'
  60. waitForUpdate(() => {
  61. expect(vm.$refs.test.$options.id).toBe('test2')
  62. vm.test = ''
  63. }).then(() => {
  64. expect(vm.$refs.test).toBeUndefined()
  65. }).then(done)
  66. })
  67. it('should register as Array when used with v-for', done => {
  68. const vm = new Vue({
  69. data: {
  70. items: [1, 2, 3]
  71. },
  72. template: `
  73. <div>
  74. <div v-for="n in items" v-ref:list>{{n}}</div>
  75. </div>
  76. `
  77. }).$mount()
  78. assertRefs()
  79. // updating
  80. vm.items.push(4)
  81. waitForUpdate(assertRefs)
  82. .then(() => { vm.items = [] })
  83. .then(assertRefs)
  84. .then(done)
  85. function assertRefs () {
  86. expect(Array.isArray(vm.$refs.list)).toBe(true)
  87. expect(vm.$refs.list.length).toBe(vm.items.length)
  88. expect(vm.$refs.list.every((item, i) => item.textContent === String(i + 1))).toBe(true)
  89. }
  90. })
  91. it('should register as Array when used with v-for (components)', done => {
  92. const vm = new Vue({
  93. data: {
  94. items: [1, 2, 3]
  95. },
  96. template: `
  97. <div>
  98. <test v-for="n in items" v-ref:list :n="n"></test>
  99. </div>
  100. `,
  101. components: {
  102. test: {
  103. props: ['n'],
  104. template: '<div>{{ n }}</div>'
  105. }
  106. }
  107. }).$mount()
  108. assertRefs()
  109. // updating
  110. vm.items.push(4)
  111. waitForUpdate(assertRefs)
  112. .then(() => { vm.items = [] })
  113. .then(assertRefs)
  114. .then(done)
  115. function assertRefs () {
  116. expect(Array.isArray(vm.$refs.list)).toBe(true)
  117. expect(vm.$refs.list.length).toBe(vm.items.length)
  118. expect(vm.$refs.list.every((comp, i) => comp.$el.textContent === String(i + 1))).toBe(true)
  119. }
  120. })
  121. })