ref.spec.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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 work as a hyperscript prop', () => {
  26. const vm = new Vue({
  27. components,
  28. render () {
  29. const h = this.$createElement
  30. return h('div', null, [
  31. h('test', { ref: 'test' })
  32. ])
  33. }
  34. })
  35. vm.$mount()
  36. expect(vm.$refs.test).toBeTruthy()
  37. expect(vm.$refs.test.$options.id).toBe('test')
  38. })
  39. it('should accept camelCase refs', () => {
  40. const vm = new Vue({
  41. template:
  42. `<div>
  43. <test v-ref:test></test>
  44. <test2 v-ref:testCase></test2>
  45. </div>`,
  46. components
  47. })
  48. vm.$mount()
  49. expect(vm.$refs.test).toBeTruthy()
  50. expect(vm.$refs.test.$options.id).toBe('test')
  51. expect(vm.$refs.testCase).toBeTruthy()
  52. expect(vm.$refs.testCase.$options.id).toBe('test2')
  53. })
  54. it('should accept HOC component', () => {
  55. const vm = new Vue({
  56. template: '<test v-ref:test></test>',
  57. components
  58. })
  59. vm.$mount()
  60. expect(vm.$refs.test).toBeTruthy()
  61. expect(vm.$refs.test.$options.id).toBe('test')
  62. })
  63. it('should accept dynamic component', done => {
  64. const vm = new Vue({
  65. template: `<div>
  66. <component :is="test" v-ref:test></component>
  67. </div>`,
  68. components,
  69. data: { test: 'test' }
  70. })
  71. vm.$mount()
  72. expect(vm.$refs.test.$options.id).toBe('test')
  73. vm.test = 'test2'
  74. waitForUpdate(() => {
  75. expect(vm.$refs.test.$options.id).toBe('test2')
  76. vm.test = ''
  77. }).then(() => {
  78. expect(vm.$refs.test).toBeUndefined()
  79. }).then(done)
  80. })
  81. it('should register as Array when used with v-for', done => {
  82. const vm = new Vue({
  83. data: {
  84. items: [1, 2, 3]
  85. },
  86. template: `
  87. <div>
  88. <div v-for="n in items" v-ref:list>{{n}}</div>
  89. </div>
  90. `
  91. }).$mount()
  92. assertRefs()
  93. // updating
  94. vm.items.push(4)
  95. waitForUpdate(assertRefs)
  96. .then(() => { vm.items = [] })
  97. .then(assertRefs)
  98. .then(done)
  99. function assertRefs () {
  100. expect(Array.isArray(vm.$refs.list)).toBe(true)
  101. expect(vm.$refs.list.length).toBe(vm.items.length)
  102. expect(vm.$refs.list.every((item, i) => item.textContent === String(i + 1))).toBe(true)
  103. }
  104. })
  105. it('should register as Array when used with v-for (components)', done => {
  106. const vm = new Vue({
  107. data: {
  108. items: [1, 2, 3]
  109. },
  110. template: `
  111. <div>
  112. <test v-for="n in items" v-ref:list :n="n"></test>
  113. </div>
  114. `,
  115. components: {
  116. test: {
  117. props: ['n'],
  118. template: '<div>{{ n }}</div>'
  119. }
  120. }
  121. }).$mount()
  122. assertRefs()
  123. // updating
  124. vm.items.push(4)
  125. waitForUpdate(assertRefs)
  126. .then(() => { vm.items = [] })
  127. .then(assertRefs)
  128. .then(done)
  129. function assertRefs () {
  130. expect(Array.isArray(vm.$refs.list)).toBe(true)
  131. expect(vm.$refs.list.length).toBe(vm.items.length)
  132. expect(vm.$refs.list.every((comp, i) => comp.$el.textContent === String(i + 1))).toBe(true)
  133. }
  134. })
  135. })