diff --git a/src/core/observer/index.js b/src/core/observer/index.js index fe1d4614d71..1e5e914f69d 100644 --- a/src/core/observer/index.js +++ b/src/core/observer/index.js @@ -218,7 +218,11 @@ export function set (obj: Array | Object, key: any, val: any) { /** * Delete a property and trigger change if necessary. */ -export function del (obj: Object, key: string) { +export function del (obj: Array | Object, key: any) { + if (Array.isArray(obj)) { + obj.splice(key, 1) + return + } const ob = obj.__ob__ if (obj._isVue || (ob && ob.vmCount)) { process.env.NODE_ENV !== 'production' && warn( diff --git a/test/unit/features/global-api/set-delete.spec.js b/test/unit/features/global-api/set-delete.spec.js index 0e19f69395e..7a20666b12a 100644 --- a/test/unit/features/global-api/set-delete.spec.js +++ b/test/unit/features/global-api/set-delete.spec.js @@ -72,5 +72,29 @@ describe('Global API: set/delete', () => { expect(vm.$el.innerHTML).toBe('') }).then(done) }) + + it('be able to delete an item 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.delete(vm.lists, 1) + waitForUpdate(() => { + expect(vm.$el.innerHTML).toBe('

A

C

') + Vue.delete(vm.lists, 1) + }).then(() => { + expect(vm.$el.innerHTML).toBe('

A

') + Vue.delete(vm.lists, 0) + }).then(() => { + expect(vm.$el.innerHTML).toBe('') + }).then(done) + }) }) })