2
0

set-delete.spec.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import Vue from 'vue'
  2. describe('Global API: set/delete', () => {
  3. describe('Vue.set', () => {
  4. it('should update a vue object', done => {
  5. const vm = new Vue({
  6. template: '<div>{{x}}</div>',
  7. data: { x: 1 }
  8. }).$mount()
  9. expect(vm.$el.innerHTML).toBe('1')
  10. Vue.set(vm, 'x', 2)
  11. waitForUpdate(() => {
  12. expect(vm.$el.innerHTML).toBe('2')
  13. }).then(done)
  14. })
  15. it('should update an observing object', done => {
  16. const vm = new Vue({
  17. template: '<div>{{foo.x}}</div>',
  18. data: { foo: { x: 1 } }
  19. }).$mount()
  20. expect(vm.$el.innerHTML).toBe('1')
  21. Vue.set(vm.foo, 'x', 2)
  22. waitForUpdate(() => {
  23. expect(vm.$el.innerHTML).toBe('2')
  24. }).then(done)
  25. })
  26. it('should update an observing array', done => {
  27. const vm = new Vue({
  28. template: '<div><div v-for="v,k in list">{{k}}-{{v}}</div></div>',
  29. data: { list: ['a', 'b', 'c'] }
  30. }).$mount()
  31. expect(vm.$el.innerHTML).toBe(
  32. '<div>0-a</div><div>1-b</div><div>2-c</div>'
  33. )
  34. Vue.set(vm.list, 1, 'd')
  35. waitForUpdate(() => {
  36. expect(vm.$el.innerHTML).toBe(
  37. '<div>0-a</div><div>1-d</div><div>2-c</div>'
  38. )
  39. Vue.set(vm.list, '2', 'e')
  40. })
  41. .then(() => {
  42. expect(vm.$el.innerHTML).toBe(
  43. '<div>0-a</div><div>1-d</div><div>2-e</div>'
  44. )
  45. /* eslint-disable no-new-wrappers */
  46. Vue.set(vm.list, new Number(1), 'f')
  47. })
  48. .then(() => {
  49. expect(vm.$el.innerHTML).toBe(
  50. '<div>0-a</div><div>1-f</div><div>2-e</div>'
  51. )
  52. Vue.set(vm.list, '3g', 'g')
  53. })
  54. .then(() => {
  55. expect(vm.$el.innerHTML).toBe(
  56. '<div>0-a</div><div>1-f</div><div>2-e</div>'
  57. )
  58. })
  59. .then(done)
  60. })
  61. it('should update a vue object with nothing', done => {
  62. const vm = new Vue({
  63. template: '<div>{{x}}</div>',
  64. data: { x: 1 }
  65. }).$mount()
  66. expect(vm.$el.innerHTML).toBe('1')
  67. Vue.set(vm, 'x', null)
  68. waitForUpdate(() => {
  69. expect(vm.$el.innerHTML).toBe('')
  70. Vue.set(vm, 'x')
  71. })
  72. .then(() => {
  73. expect(vm.$el.innerHTML).toBe('')
  74. })
  75. .then(done)
  76. })
  77. it('be able to use string type index in array', done => {
  78. const vm = new Vue({
  79. template: '<div><p v-for="obj in lists">{{obj.name}}</p></div>',
  80. data: {
  81. lists: [{ name: 'A' }, { name: 'B' }, { name: 'C' }]
  82. }
  83. }).$mount()
  84. expect(vm.$el.innerHTML).toBe('<p>A</p><p>B</p><p>C</p>')
  85. Vue.set(vm.lists, '0', { name: 'D' })
  86. waitForUpdate(() => {
  87. expect(vm.$el.innerHTML).toBe('<p>D</p><p>B</p><p>C</p>')
  88. }).then(done)
  89. })
  90. // #6845
  91. it('should not overwrite properties on prototype chain', () => {
  92. class Model {
  93. _bar?: string
  94. constructor() {
  95. this._bar = null
  96. }
  97. get bar() {
  98. return this._bar
  99. }
  100. set bar(newvalue) {
  101. this._bar = newvalue
  102. }
  103. }
  104. const vm = new Vue({
  105. data: {
  106. data: new Model()
  107. }
  108. })
  109. Vue.set(vm.data, 'bar', 123)
  110. expect(vm.data.bar).toBe(123)
  111. expect(vm.data.hasOwnProperty('bar')).toBe(false)
  112. expect(vm.data._bar).toBe(123)
  113. })
  114. })
  115. describe('Vue.delete', () => {
  116. it('should delete a key', done => {
  117. const vm = new Vue({
  118. template: '<div>{{obj.x}}</div>',
  119. data: { obj: { x: 1 } }
  120. }).$mount()
  121. expect(vm.$el.innerHTML).toBe('1')
  122. vm.obj.x = 2
  123. waitForUpdate(() => {
  124. expect(vm.$el.innerHTML).toBe('2')
  125. Vue.delete(vm.obj, 'x')
  126. })
  127. .then(() => {
  128. expect(vm.$el.innerHTML).toBe('')
  129. vm.obj.x = 3
  130. })
  131. .then(() => {
  132. expect(vm.$el.innerHTML).toBe('')
  133. })
  134. .then(done)
  135. })
  136. it('be able to delete an item in array', done => {
  137. const vm = new Vue({
  138. template: '<div><p v-for="obj in lists">{{obj.name}}</p></div>',
  139. data: {
  140. lists: [{ name: 'A' }, { name: 'B' }, { name: 'C' }]
  141. }
  142. }).$mount()
  143. expect(vm.$el.innerHTML).toBe('<p>A</p><p>B</p><p>C</p>')
  144. Vue.delete(vm.lists, 1)
  145. waitForUpdate(() => {
  146. expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
  147. Vue.delete(vm.lists, NaN)
  148. })
  149. .then(() => {
  150. expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
  151. Vue.delete(vm.lists, -1)
  152. })
  153. .then(() => {
  154. expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
  155. Vue.delete(vm.lists, '1.3')
  156. })
  157. .then(() => {
  158. expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
  159. Vue.delete(vm.lists, true)
  160. })
  161. .then(() => {
  162. expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
  163. Vue.delete(vm.lists, {})
  164. })
  165. .then(() => {
  166. expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
  167. Vue.delete(vm.lists, '1')
  168. })
  169. .then(() => {
  170. expect(vm.$el.innerHTML).toBe('<p>A</p>')
  171. /* eslint-disable no-new-wrappers */
  172. Vue.delete(vm.lists, new Number(0) as number)
  173. })
  174. .then(() => {
  175. expect(vm.$el.innerHTML).toBe('')
  176. })
  177. .then(done)
  178. })
  179. })
  180. })