From 8a2c5147ad9ac9444c0f7c30b5f4a3c4e15c033b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=90?= <383109956@qq.com> Date: Fri, 16 Jun 2017 09:37:31 +0800 Subject: [PATCH] Be able to use string type index in array (#5889) --- src/core/observer/index.js | 2 +- .../features/global-api/set-delete.spec.js | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/core/observer/index.js b/src/core/observer/index.js index a71334f8397..68967e60a48 100644 --- a/src/core/observer/index.js +++ b/src/core/observer/index.js @@ -189,7 +189,7 @@ export function defineReactive ( * already exist. */ export function set (target: Array | 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 diff --git a/test/unit/features/global-api/set-delete.spec.js b/test/unit/features/global-api/set-delete.spec.js index 7a20666b12a..fd27094522f 100644 --- a/test/unit/features/global-api/set-delete.spec.js +++ b/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: '

{{obj.name}}

', + data: { + lists: [ + { name: 'A' }, + { name: 'B' }, + { name: 'C' } + ] + } + }).$mount() + expect(vm.$el.innerHTML).toBe('

A

B

C

') + Vue.set(vm.lists, '0', { name: 'D' }) + waitForUpdate(() => { + expect(vm.$el.innerHTML).toBe('

D

B

C

') + }).then(done) + }) }) })