Vue2和Vue3的响应式原理及区别

响应式数据的声明。以下内容帮助理解,不建议死记硬背

1、在Vue2中,只要是在data里面定义的数据,就能在模板中使用,且它是一个响应式数据。数据进行修改,模板就会进行修改。但是其不能监听到深层对象数据和数组数据的更改。Vue2是通过this.$set和this.$delete两个api去解决的

比如this.$set(this.person,“sex”,“女”)给person对象添加一个sex为女的响应式属性

this.$delete(this.person,name)是动态的删除person对象的name属性

2、Vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的。Vue3中使用了es6的proxy对数据进行处理。

3、在Vue3中,ref函数常用于将简单数据类型定义为响应式数据。relactive函数常用于声明复杂数据类型为响应式

reactive函数里面写了具体对proxy的实现

ref处理基本数据类型,底层用的是objectdefineproperty,用的是getter和setter,但是处理对象数据其底层还是求助了reactive 。是通过proxy来实现的

ref既可以声明简单数据类型也可以声明复杂数据类型,relative只能声明复杂数据类型

4、取值:在setup里面再次获ref声明的数据的值时,需要.value;在模板中使用ref声明的响应式数据,可以省略.value(因为模板在解析的时候会判断,数据是否是ref声明的数据,如果是,会直接取出里面value的值)

5、Vue3下响应式原理如下

其底层对数据的增删改查是通过Proxy和Reflect去处理的(代理和反射)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
       let person = {
            name:'张三',
            age:18
        }
        const p = new Proxy(person,{
            //读取的对象和属性
            get(target,propName){
                console.log(`有人读取了p身上的${propName}属性`);
                //Reflect(反射)读取对象身上的属性
                return Reflect.get(target,propName);
            },
            //修改或新增的对象,修改或新增的属性,修改或新增后的值
            set(target,propName,value){
                //下面的p即为target
                console.log(`有人修改了p身上的${propName}属性`);
                //修改和新增对象身上的属性
                return Reflect.set(target,propName,value);
            },
            //删除的对象和属性
            deleteProperty(target,propName){
                console.log(`有人删除了p身上的${propName}属性`);
                //删除对象身上的属性
                return Reflect.deleteProperty(target,propName);
            }
        })
    </script>
</body>
</html>

 运行上面的代码,就可以在浏览器的控制台进行验证