响应式数据的声明。以下内容帮助理解,不建议死记硬背
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去处理的(代理和反射)
- 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>Documenttitle>
- 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>
运行上面的代码,就可以在浏览器的控制台进行验证