【思考】Vue2响应丢失、$set
- vue2响应丢失情况复现
- 原因
- 解决
- 总结
vue2响应丢失情况复现
场景:直接通过数组下标去修改数组造成响应丢失
<template><div><p v-for="(item, index) in list" :key="index">{{item}}</p><button @click="change">change</button></div>
</template><script>
export default {data(){return {list: ['张三','李四','王五',]}},methods: {change() {this.list[0] = 'hsy';console.log('this.list[0]:' + this.list[0]);}}
}
</script>
原因
具体原理涉及到数据的存储方式以及vue2的响应原理,具体可以参考这篇文章——【博主:AC_uv】手撕vue2响应式
简单来说,就是Vue2的响应原理它不支持深层次的响应
解决
vue2提供了一个api $set
可以解决这个问题,this.$set(target,key,value)
change() {// this.list[0] = 'hsy';this.$set(this.list, 0, 'hsy');console.log('this.list[0]:' + this.list[0]);
}
总结
Vue3的响应原理和Vue2不同,它就规避了这种造成响应丢失的情况,所以在Vue3中是没有$set这个API的。
但是Vue3的响应原理还是有缺陷的,还是有可能出现响应丢失的情况。但我暂时没遇到过,等下次遇到的时候再来研究记录。