vue2中修改对象或者数组中的属性的时候,页面数据不同步更新,这个时候需要有两种办法,第一种是:
import Vue from 'vue'
//利用Vue身上的set属性来修改
Vue.set(修改哪个对象或者数组,'键','值')
第二种就是以下 this.$set用法:
直接改动数组并不能驱动视图更新---------this.$set()
使用的场景是: 给对象或者数组里面的某个属性重新赋值
假设一个场景:控制元素的显示与隐藏,
data(){
return {
arr: [ ]
}
}
在项目中,肯定不只一行这样的数据,假如说是10行这样的数据,数组中,区分哪个时,用下角标, arr【0】 取到的就是数组第一项的值
所以说,提到数组,就是 0 : 值 , 1 : 值。。。。。。。
既然它有下角标,并且呢,可以用来区分每一项,那好,我需要的是 布尔值
this.$set( this.arr, scope.$index, true)
数组或者对象 什么属性 改成什么(除了改布尔值,还可以改成其他的)
// 前提是
beginEdit(scope) {
this.$set(this.arr, scope.$index, true)
}
// 你要传下来这个scope
v-if="arr[scope.$index]" 点击之后,把当前行 索引 变成了 true、 false,通过v-if 来控制他的显示与隐藏
通过$set 改完之后是上面图片这个样子,0 : true 1 :false ................
所以说啊,就相当于是arr = [true,false,true,true,false]
this.$set的使用场景: 给数组或对象中的属性改值, 【属性: 值,属性: 值】 {属性: 值,属性: 值} 改完之后呢,页面也要跟着同步更新----------就用this.$set ,这个场景想到用this.$set是这样的,首先我需要区分改的是哪一行,想到数组里面的下角标是可以知道是哪个的, 改完true,或者false之后,页面跟着变化
再来举个例子:
<template>
<div>
<ul>
<li v-for="item in arr">{{ item }}</li>
</ul>
<button @click="soBtn">排序</button>
<button @click="reBtn">翻转</button>
<button @click="jBtn">截取前3个</button>
<button @click="upBtn">点击改掉第一个元素的值</button>
</div>
</template>
<script>
export default {
data() {
return {
arr: [3, 15, 10, 1, 19, 32],
};
},
methods: {
soBtn() {
this.arr.sort();
},
reBtn() {
this.arr.reverse();
},
jBtn() {
this.arr = this.arr.slice(0, 3);
},
upBtn() {
// this.arr[0] = "老李"; // 页面无变化 - vue无法监测数组里值的改变
// 可以使用数组提供的方法
// 数据目标, 索引, 新值
// Vue.set(this.arr, 0, "老李"); // 静态方法set
this.$set(this.arr, 0, "老李"); // 实例方法$set
},
},
};
</script>
总结:
改变原数组的方法才能让v-for更新, 如果未更新, 使用this.$set()方法, 或者覆盖原目标结构