Skip to content

Commit 466e849

Browse files
Hanks10100yyx990803
authored andcommitted
Be able to delete array item in Vue.delete (#4747)
* Support to delete array item in Vue.delete * add test case for Vue.delete array * add blank line between test cases
1 parent 458671b commit 466e849

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

Diff for: src/core/observer/index.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,11 @@ export function set (obj: Array<any> | Object, key: any, val: any) {
218218
/**
219219
* Delete a property and trigger change if necessary.
220220
*/
221-
export function del (obj: Object, key: string) {
221+
export function del (obj: Array<any> | Object, key: any) {
222+
if (Array.isArray(obj)) {
223+
obj.splice(key, 1)
224+
return
225+
}
222226
const ob = obj.__ob__
223227
if (obj._isVue || (ob && ob.vmCount)) {
224228
process.env.NODE_ENV !== 'production' && warn(

Diff for: test/unit/features/global-api/set-delete.spec.js

+24
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,29 @@ describe('Global API: set/delete', () => {
7272
expect(vm.$el.innerHTML).toBe('')
7373
}).then(done)
7474
})
75+
76+
it('be able to delete an item in array', done => {
77+
const vm = new Vue({
78+
template: '<div><p v-for="obj in lists">{{obj.name}}</p></div>',
79+
data: {
80+
lists: [
81+
{ name: 'A' },
82+
{ name: 'B' },
83+
{ name: 'C' }
84+
]
85+
}
86+
}).$mount()
87+
expect(vm.$el.innerHTML).toBe('<p>A</p><p>B</p><p>C</p>')
88+
Vue.delete(vm.lists, 1)
89+
waitForUpdate(() => {
90+
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
91+
Vue.delete(vm.lists, 1)
92+
}).then(() => {
93+
expect(vm.$el.innerHTML).toBe('<p>A</p>')
94+
Vue.delete(vm.lists, 0)
95+
}).then(() => {
96+
expect(vm.$el.innerHTML).toBe('')
97+
}).then(done)
98+
})
7599
})
76100
})

0 commit comments

Comments
 (0)