Vue中$set
$set
你在vue开发中有没有遇见过 模型数据改变了 但是视图没有发生改变的情况 是怎么解决这个问题的?
出现的场景
当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。
<template>
<div class="hello">
<h1>$set</h1>
你在vue开发中有没有遇见过 模型数据改变了 但是视图没有发生改变的情况 是怎么解决这个问题的?
<h1>{{arr.name}}-----{{arr.age}}</h1>
<button @click="fun()">点我添加一个age</button>
</div>
</template>
<script>
export default {
data(){
return {
arr:{
name:"xixi"
}
}
},
methods:{
fun(){
this.arr.age=18
console.log(this.arr.age)
}
},
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<style >
</style>
出现这种情况的原理
官方这样说:
当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。 受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
简单点来解释:
Object.defineProperty只会在初始化的时候监听data模型数据 如果中途加入新的对象属性 那么这个方法就不会监听到 不监听也就没有了双向绑定 没有了双向绑定就不会有模型变了视图发生改变这一说
解决问题
$set()
<template>
<div class="hello">
<h1>$set</h1>
你在vue开发中有没有遇见过 模型数据改变了 但是视图没有发生改变的情况 是怎么解决这个问题的?
<h1>{{arr.name}}-----{{arr.age}}</h1>
<button @click="fun()">点我添加一个age</button>
</div>
</template>
<script>
export default {
data(){
return {
arr:{
name:"xixi"
}
}
},
methods:{
fun(){
// this.arr.age=18
// this.$set(要操作的数据,新增的内容,值)
this.$set(this.arr,"age",19)
console.log(this.arr.age)
}
},
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<style scoped>
</style>
本文来自博客园,作者:{Teil}},转载请注明原文链接:https://www.cnblogs.com/user-001/p/15632670.html