2022-09-22 16:54

VUE中数组和对象的自动响应

王姐姐

WEB前端

(664)

(0)

收藏

1. 数组自动响应

1.1. 说明

push pop shift unshift splice sort reverse 或者直接给数组赋值等都会触发自动响应

concat、filters、slice等等不对数组本身造成变化的都不会触发自动响应,concat会返回新数组,不对原有数组操作。

arr[i] = xxx和arr.length = len:这两种方式都不会立刻触发响应式,有其它的响应渲染视图时会一并渲染数组,比如调用arr的push方法时。

1.2. 数组中存放基本值

<ul>
    <li v-for="(name,index) in names">{{index}}.{{name}}</li>
</ul>
data() {
    return {
        names:["mike","john","sarah","angela"]
    }
}

可以测试:

$vm.names.push("hello") 重新渲染界面
$vm.names.pop() 重新渲染界面
$vm.names[0]="aaa" 不响应
$vm.names.push("hello") 重新渲染界面,上面的aaa也渲染出去
$vm.names.length=3 不响应
$vm.names.push("hello")重新渲染,上面的也其作用

1.3. 数组中存放对象

<ul>
    <li v-for="(userinfo,index) in userinfos">{{index}}.{{userinfo.id}}.{{userinfo.name}}</li>
</ul>
 
data() {
    return {
        names:["mike","john","sarah","angela"],
        userinfos:[{id:1,name:"aaa"},{id:2,name:"bbb"},{id:3,name:"ccc"}]
    }
}
$vm.userinfos[0].name="ddd" 重新渲染
$vm.userinfos[0]={id:4,name:"ddd"} 不重新渲染但是值在内存中,如果有其他的渲染,那么这个内存的值会被一起渲染出去。

1.4. 通过set实现数组下标响应式

$set(数组名字, 改变的索引位置, 需要更改的值)

this.$set(this.names,0,"aaa")

或者

Vue.set(数组名字, 改变的索引位置, 需要更改的值)

import Vue from 'vue'
Vue.set(this.names,0,"aaa");

2. 对象响应式

2.1. 说明

Vue不能检测对象属性的添加、删除,也就是说删除属性或者增加新属性都不是响应式的,不会重新渲染界面。

可直接对该对象重新赋值、修改该对象或内层对象的属性,这些都是响应式的。

{{userinfo}}
{{userinfo.website.url}}
userinfo:{id:1,name:"wanma",website:{}}
this.userinfo.website.url="https://www.wanmait.com";不会触发重渲染, 但是值在内存中
this.userinfo.name="wanmait";触发重渲染,并且将website.url在内存中的值也渲染了。

2.2. 通过set实现对象响应式

Vue.set(对象, 对象属性, 属性值)

或者

this.$set(对象, 对象属性, 属性值)


let url = "https://www.wanmait.com";
this.$set(this.userinfo.website,"url",url)

会重新渲染界面。

2.3. Vue.delete()&this.$delete()

一般删除对象某个属性,使用delete obj.xx,这种删除操作不会触发响应式。

如果需要删除操作是响应式的,可以使用:

Vue.delete(obj, 属性名)

或者

this.$delete(obj,属性名)


0条评论

点击登录参与评论