为什么 Vue2会出现数据更新视图不更新 Vue3不会出现

Vue2使用 Object.defineProperty 来进行数据劫持 实现响应式

Vue 3 使用Proxy对象来 实现响应式

Vue2使用 Object.defineProperty来进行数据劫持

  • Object.defineProperty在初始化实例时就会使用对数据进行响应式处理,且只会针对单个已定义的属性进行处理。

后添加的属性无法走到Object.defineProperty 这一步,所有无法更新视图

复制代码
var vm = new Vue({
    el: '#app',
    data: {
        user: {
            name: 'John'
        }
    }
});

直接添加新属性,添加age属性后,视图不会自动更新。

vm.user.age = 30

必须使用set(target,index,val)来改变数据和视图,但是在vue3中不存在set 。

当你直接通过索引修改数组元素时,Vue 2 无法检测到这种变化。

复制代码
var vm = new Vue({
    el: '#app',
    data: {
        items: ['a', 'b', 'c']
    }
});

通过索引修改数组元素

vm.items1 = 'd';

视图也不会更新,因为 Vue 2 没有对这种操作进行响应式跟踪,

使用push、pop、splice $set(target,index,val)来改变数据和视图

Vue 3 使用Proxy对象来实现响应式。

Proxy可以代理整个对象,

  • 它是对整个对象进行代理。
  • Proxy的handler对象中的拦截器方法(如get和set)会在访问或修改目标对象的任何属性时被触发,不管这个属性是在代理之前就存在还是后来添加的。

添加新属性或修改属性时,只要被Proxy代理的,那么这些变化都能被检测到。

javascript 复制代码
import { reactive } from 'vue';
const state = reactive({
    user: {
        name: 'John'
    }
});

新增属性

state.user.age = 30;

视图会自动更新,

因为reactive函数利用Proxy创建了响应式对象,能够捕获对象属性的新增、删除和修改等操作。

Vue 3 对数组的变更检测也进行了优化

在 Vue 2 中推荐使用特定的数组变异方法(如push、pop、splice等)来触发视图更新,

但在 Vue 3 中,通过Proxy的特性,即使是直接修改数组元素(例如通过索引修改)也能被正确检测到,从而更新视图。

相关推荐
虚无境41 分钟前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
濮水大叔2 小时前
函数式与对象式:前端架构的两种成本曲线
vue.js·react.js·函数式编程
zimoyin2 小时前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化
FRing032 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
vx_Biye_Design3 小时前
django房屋租赁推荐系统78455-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·express
OpsEye4 小时前
怎么实现大模型的按用户、按应用配额限流?
javascript·ai编程
林恒smileZAZ4 小时前
浏览器为什么加载不了超大图片
前端·vue.js·html5
云舜言传4 小时前
Bloom 手势演示操作 · 录屏指南
javascript·深度学习·机器学习
Highcharts.js8 小时前
BI可视化图表“维护难”问题的解决方案
开发语言·前端·javascript·编辑器·ecmascript·bi·highcharts
Java后端的Ai之路8 小时前
前端技术Vue-13-安装webpack与vuejs
前端·vue.js·webpack