2016-04-26 00:46:19 +08:00
|
|
|
import Vue from 'vue'
|
|
|
|
|
2016-05-25 02:12:10 +08:00
|
|
|
describe('Global API: set/delete', () => {
|
2016-04-26 00:46:19 +08:00
|
|
|
describe('Vue.set', () => {
|
2016-04-26 00:58:37 +08:00
|
|
|
it('should update a vue object', done => {
|
2016-04-26 00:46:19 +08:00
|
|
|
const vm = new Vue({
|
|
|
|
template: '<div>{{x}}</div>',
|
2016-04-26 00:58:37 +08:00
|
|
|
data: { x: 1 }
|
2016-05-12 03:40:50 +08:00
|
|
|
}).$mount()
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('1')
|
|
|
|
Vue.set(vm, 'x', 2)
|
2016-04-26 11:25:59 +08:00
|
|
|
waitForUpdate(() => {
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('2')
|
2016-05-19 01:08:14 +08:00
|
|
|
}).then(done)
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
|
|
|
|
2021-11-17 17:16:58 +08:00
|
|
|
it('should update an observing object', done => {
|
2016-04-26 00:46:19 +08:00
|
|
|
const vm = new Vue({
|
|
|
|
template: '<div>{{foo.x}}</div>',
|
2016-04-26 00:58:37 +08:00
|
|
|
data: { foo: { x: 1 } }
|
2016-05-12 03:40:50 +08:00
|
|
|
}).$mount()
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('1')
|
|
|
|
Vue.set(vm.foo, 'x', 2)
|
2016-04-26 11:25:59 +08:00
|
|
|
waitForUpdate(() => {
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('2')
|
2016-05-19 01:08:14 +08:00
|
|
|
}).then(done)
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
|
|
|
|
2021-11-17 17:16:58 +08:00
|
|
|
it('should update an observing array', done => {
|
2016-04-26 00:46:19 +08:00
|
|
|
const vm = new Vue({
|
|
|
|
template: '<div><div v-for="v,k in list">{{k}}-{{v}}</div></div>',
|
2016-04-26 00:58:37 +08:00
|
|
|
data: { list: ['a', 'b', 'c'] }
|
2016-05-12 03:40:50 +08:00
|
|
|
}).$mount()
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe(
|
|
|
|
'<div>0-a</div><div>1-b</div><div>2-c</div>'
|
|
|
|
)
|
|
|
|
Vue.set(vm.list, 1, 'd')
|
2016-04-26 11:25:59 +08:00
|
|
|
waitForUpdate(() => {
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe(
|
|
|
|
'<div>0-a</div><div>1-d</div><div>2-c</div>'
|
|
|
|
)
|
2017-07-01 11:22:25 +08:00
|
|
|
Vue.set(vm.list, '2', 'e')
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe(
|
|
|
|
'<div>0-a</div><div>1-d</div><div>2-e</div>'
|
|
|
|
)
|
|
|
|
/* eslint-disable no-new-wrappers */
|
|
|
|
Vue.set(vm.list, new Number(1), 'f')
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe(
|
|
|
|
'<div>0-a</div><div>1-f</div><div>2-e</div>'
|
|
|
|
)
|
|
|
|
Vue.set(vm.list, '3g', 'g')
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe(
|
|
|
|
'<div>0-a</div><div>1-f</div><div>2-e</div>'
|
|
|
|
)
|
2016-05-19 01:08:14 +08:00
|
|
|
})
|
|
|
|
.then(done)
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
|
|
|
|
2016-04-26 00:58:37 +08:00
|
|
|
it('should update a vue object with nothing', done => {
|
2016-04-26 00:46:19 +08:00
|
|
|
const vm = new Vue({
|
|
|
|
template: '<div>{{x}}</div>',
|
2016-04-26 00:58:37 +08:00
|
|
|
data: { x: 1 }
|
2016-05-12 03:40:50 +08:00
|
|
|
}).$mount()
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('1')
|
|
|
|
Vue.set(vm, 'x', null)
|
2016-04-26 11:25:59 +08:00
|
|
|
waitForUpdate(() => {
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
|
|
|
Vue.set(vm, 'x')
|
2016-04-26 11:25:59 +08:00
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
2016-05-19 01:08:14 +08:00
|
|
|
})
|
|
|
|
.then(done)
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
2017-06-29 12:39:02 +08:00
|
|
|
|
|
|
|
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)
|
|
|
|
})
|
2017-10-26 19:52:36 +08:00
|
|
|
|
|
|
|
// #6845
|
|
|
|
it('should not overwrite properties on prototype chain', () => {
|
|
|
|
class Model {
|
2022-05-04 01:04:55 +08:00
|
|
|
_bar?: string
|
2017-10-26 19:52:36 +08:00
|
|
|
constructor() {
|
|
|
|
this._bar = null
|
|
|
|
}
|
|
|
|
get bar() {
|
|
|
|
return this._bar
|
|
|
|
}
|
|
|
|
set bar(newvalue) {
|
|
|
|
this._bar = newvalue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const vm = new Vue({
|
|
|
|
data: {
|
|
|
|
data: new Model()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
Vue.set(vm.data, 'bar', 123)
|
|
|
|
expect(vm.data.bar).toBe(123)
|
|
|
|
expect(vm.data.hasOwnProperty('bar')).toBe(false)
|
|
|
|
expect(vm.data._bar).toBe(123)
|
|
|
|
})
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
describe('Vue.delete', () => {
|
2016-04-26 00:58:37 +08:00
|
|
|
it('should delete a key', done => {
|
2016-04-26 00:46:19 +08:00
|
|
|
const vm = new Vue({
|
2016-04-26 11:30:48 +08:00
|
|
|
template: '<div>{{obj.x}}</div>',
|
|
|
|
data: { obj: { x: 1 } }
|
2016-05-12 03:40:50 +08:00
|
|
|
}).$mount()
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('1')
|
2016-04-26 11:30:48 +08:00
|
|
|
vm.obj.x = 2
|
2016-04-26 11:25:59 +08:00
|
|
|
waitForUpdate(() => {
|
2016-04-26 00:46:19 +08:00
|
|
|
expect(vm.$el.innerHTML).toBe('2')
|
2016-04-26 11:30:48 +08:00
|
|
|
Vue.delete(vm.obj, 'x')
|
2016-04-26 11:25:59 +08:00
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
2016-04-26 11:30:48 +08:00
|
|
|
vm.obj.x = 3
|
2016-04-26 11:25:59 +08:00
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
2016-05-19 01:08:14 +08:00
|
|
|
})
|
|
|
|
.then(done)
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
2017-01-19 23:41:32 +08:00
|
|
|
|
|
|
|
it('be able to delete an item 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.delete(vm.lists, 1)
|
|
|
|
waitForUpdate(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
|
2017-07-01 11:22:25 +08:00
|
|
|
Vue.delete(vm.lists, NaN)
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
|
|
|
|
Vue.delete(vm.lists, -1)
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
|
|
|
|
Vue.delete(vm.lists, '1.3')
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
|
|
|
|
Vue.delete(vm.lists, true)
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
|
|
|
|
Vue.delete(vm.lists, {})
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p><p>C</p>')
|
|
|
|
Vue.delete(vm.lists, '1')
|
2017-01-19 23:41:32 +08:00
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('<p>A</p>')
|
2017-07-01 11:22:25 +08:00
|
|
|
/* eslint-disable no-new-wrappers */
|
2022-05-04 01:04:55 +08:00
|
|
|
Vue.delete(vm.lists, new Number(0) as number)
|
2017-01-19 23:41:32 +08:00
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
expect(vm.$el.innerHTML).toBe('')
|
|
|
|
})
|
|
|
|
.then(done)
|
|
|
|
})
|
2016-04-26 00:46:19 +08:00
|
|
|
})
|
|
|
|
})
|