Vue方法——this.$set()解决什么问题
1.应用场景?
当你需要为对象添加一个新属性时,或者当你使用arr.length=0的方式来更改数组,此时数组长度发生变化,但视图并没有改变,这个时候就需要用到this.$set()这个方法了
简单来说,vue2是尤大通过重写数组方法的方式来进行数组的劫持,才能做到对数组的监听。
而对象新增key值,没有使用到方法(就有点像前面提到的arr.length=0),所以需要通过this.$set()或vue.set来更新。
2.this.$set实现什么功能,为什么要用它?
向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 (比如 this.myObject.newProperty = 'hi'),你会发现vue官网是vue.set,vue.set的用法,给你们插入连接,怕你们找不到😁,我们现在讲的这个this.$set()和它有什么关系呢?咱先说this.$set(),因为他们俩的区别就涉及原理问题啦。
3.怎么用它?
搞个栗子:
1.vue 中写在<template></template>标签的代码
<template>
<div>
<div v-for="(item, index) in setList">
<el-input v-model="item.name"></el-input>
</div>
<el-button @click="changeValue" type="primary">改变值</el-button>
</div>
</template>
2.export default{}中data数据
export default { name: 'demoThisSet', data () { return { setList: [ { name: 'test' }, { name: 'test1' } ] } }, methods: { changeValue () { // this.setList[2] = { name: 'test2' } this.$set(this.setList, 2, { name: 'test2' }) console.log('打印数据', this.setList) } } }
3.点击按钮触发changeValue方法,
🌹调用方法:this.$set( target, key, value )
🌹 target:要更改的数据源(可以是对象或者数组)
🌹 key:要更改的具体数据
🌹 value :重新赋的值
4.在没有点击按钮的时候,界面是这样的,虽然界面没有显示出来,但是控制台已经打印出来了
this.setList[2] = { name: 'test2' } 会导致控制台能打印出来,但界面没有显示出来
5.当点击按钮的时候,调用this.$set方法,成功显示第三个属性,这就是整个过程啦😁
this.$set(this.setList, 2, { name: 'test2' }) 控制台能打印出来,但界面也显示出来了,如果没有 加一个this.$forceUpdate()刷新当前页
参考文章: