Просмотр исходного кода

Be able to use string type index in array (#5889)

王斐 9 лет назад
Родитель
Сommit
8a2c5147ad
2 измененных файлов с 19 добавлено и 1 удалено
  1. 1 1
      src/core/observer/index.js
  2. 18 0
      test/unit/features/global-api/set-delete.spec.js

+ 1 - 1
src/core/observer/index.js

@@ -189,7 +189,7 @@ export function defineReactive (
  * already exist.
  */
 export function set (target: Array<any> | Object, key: any, val: any): any {
-  if (Array.isArray(target) && typeof key === 'number') {
+  if (Array.isArray(target) && (typeof key === 'number' || /^\d+$/.test(key))) {
     target.length = Math.max(target.length, key)
     target.splice(key, 1, val)
     return val

+ 18 - 0
test/unit/features/global-api/set-delete.spec.js

@@ -96,5 +96,23 @@ describe('Global API: set/delete', () => {
         expect(vm.$el.innerHTML).toBe('')
       }).then(done)
     })
+
+    it('be able to use string type index in array', done => {
+      const vm = new Vue({
+        template: '<div><p v-for="obj in lists">{{obj.name}}</p></div>',
+        data: {
+          lists: [
+            { name: 'A' },
+            { name: 'B' },
+            { name: 'C' }
+          ]
+        }
+      }).$mount()
+      expect(vm.$el.innerHTML).toBe('<p>A</p><p>B</p><p>C</p>')
+      Vue.set(vm.lists, '0', { name: 'D' })
+      waitForUpdate(() => {
+        expect(vm.$el.innerHTML).toBe('<p>D</p><p>B</p><p>C</p>')
+      }).then(done)
+    })
   })
 })