vue3中的setup的参数(Vue3中ref与reactive的详解与扩展)
vue3中的setup的参数
Vue3中ref与reactive的详解与扩展目录
- 一、ref和reactive
- 1.reactive
- 2.ref
- 二、shallowRef和shallowReactive
- 1. ref和shallowRef
- 2. reactive和shallowReactive
- 三、toRaw
- 四、markRaw
- 五、toRef和toRefs
- 1. ref
- 2. toRef
- 3. toRefs
- 总结
死死记住:ref本质也是reactive,ref(obj)等价于reactive({value: obj})
- vue3中实现响应式数据的方法是就是使用ref和reactive,所谓响应式就是界面和数据同步,能实现实时更新
- vue2中响应式是通过defineProperty实现的,vue3中是通过ES6的Proxy来实现的
1.reactive
- reactive的参数必须是一个对象,包括json数据和数组都可以,否则不具有响应式
- 如果给reactive传递了其他对象(如时间对象),默认情况下修改对象界面不会自动更新,如果想更新,可以通过给对象重新赋值来解决
2.ref
既然有了reactive,为何还要ref呢?当我们只想让某个变量实现响应式的时候,采用reactive就会比较麻烦,因此vue3提供了ref方法进行简单值的监听,但并不是说ref只能传入简单值,他的底层是reactive,所以reactive有的,他都有。还是那句老话:
死死记住:ref本质也是reactive,ref(obj)等价于reactive({value: obj})
- 在vue中使用ref的值,不用通过.value获取
- 在js中使用ref的值,必须通过.value获取
递归监听和非递归监听
ref和reactive都属于递归监听,也就是数据的每一层都是响应式的,如果数据量比较大,非常消耗性能,非递归监听只会监听数据的第一层。
1. ref和shallowRef
- ref定义的数据每一层都是响应式数据
- shallowRef定义的数据,只有第一层是响应式的,即只有在更改.value的时候才能实现响应式
let age = ref({ a: '1', f: { b: '2', s:{ c: '3' } } }) //打印各层数据 console.log(age); console.log(age.value); console.log(age.value.f); console.log(age.value.f.s);
let age = shallowRef({ a: '1', f: { b: '2', s:{ c: '3' } } }) //打印各层数据 console.log(age); console.log(age.value); console.log(age.value.f); console.log(age.value.f.s);
使用shallowRef后,可以通过triggerRef()方法主动更新界面,实现界面刷新
function doSome(){ age.value.f.s.c = 'c'; //主动更新界面 triggerRef(age); }
2. reactive和shallowReactive
注意:shallowReactive没有类似triggerRef()的方法
三、toRawtoRaw的出现是解决什么问题呢?
有些时候我们不希望数据进行响应式实时更新,可以通过toRaw获取ref或reactive引用的原始数据,通过修改原始数据,不会造成界面的更新,只有通过修改ref和reactive包装后的数据时才会发生界面响应式变化。
let obj1 = {...}; //state和obj1是引用关系,state的本质是一个Proxy对象,其中引用了obj1 let state = reactive(obj1); //通过toRaw方法获取到原始数据,其实是获取到obj1的内存地址,obj2和obj1是完全相等的 let obj2 = toRaw(state) console.log(obj1 === obj2);//true
有些同学会问,那直接使用obj1来修改数据不就行了吗?可关键是我们在使用reactive定义数据时一般不会先定义一个obj,再将他传给reactive,都是直接在reactive中写数据的。
四、markRaw与toRaw不同,markRaw包装后的数据永远不会被追踪!
暂时没发现有什么用处(手动狗头)
let obj1 = {name: "lijing", age: 18} let obj2 = markRaw(obj1); //此时reactive包装的数据虽然是响应式对象,但是不会被跟踪,也不会产生效应式效果 let state1 = reactive(obj2) console.log(obj1 === obj2);//true
ref和toRef都是用来构造响应式数据,两者有什么区别呢,看两个例子
1. ref
复制,修改响应式数据不会影响以前的数据,数据发生改变界面就会自动更新
转换后的是一个RefImpl类型
可以看到,使用ref对一个对象的某个简单数据类型属性进行响应式改造后,通过修改响应式数据不会影响到原始数据,如上图中,通过state1修改值后,obj1中的a属性值没有发生变化。这里有个注意点:修改的这个属性必须是简单数据类型,一个具体的值,不能是引用,如果该属性也是一个对象,则会影响,因为对象--->引用!
例如上面例子中,如果传入state1的是obj1.f,则情况完全不同
//等价于let state1 = ref({b: '2',s: {c: '3'}}) // 又等价于--->let state1 = reactive({value: {....}}}) let state1 = ref(obj1.f);
2. toRef
如果使用toRef来转换,则修改响应式数据会影响到原始数据,数据发生改变,但是界面不会自动更新
转换后的是一个ObjectRefImpl类型
ref类似深拷贝,toref类似浅拷贝
3. toRefs
遍历对象中的所有属性,将其变为响应式数据,这是因为toRef只能传一个key,toRefs所达到的效果与toRef一样
tips:目前用的最多的还是ref和reactive,其他东西一般是后期用来改善性能使用的。
总结到此这篇关于Vue3中ref与reactive的文章就介绍到这了,更多相关Vue3 ref与reactive内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- vue3 axios 怎么封装api(vue中如何简单封装axios浅析)
- vue3.0 如何使用useroute(详解vue3中setUp和reactive函数的用法)
- vue3.0怎么往标签填数据(Vue3.0写自定义指令的简单步骤记录)
- vuejs过滤器使用教程(vue3删除过滤器的原因)
- vue3.0安装element(vue3+electron12+dll开发客户端配置详解)
- vue函数中的默认参数(Vue3中SetUp函数的参数props、context详解)
- 详解Vue3中Teleport的使用(详解Vue3中Teleport的使用)
- vue3.0零基础入门(快速掌握Vue3.0中如何上手Vuex状态管理)
- vue3组件通讯消息(Vue3实现Message消息组件示例)
- vue3.0 黑暗风格(Vue3.0 手写放大镜效果)
- vue3 响应式的实现过程(Vue3.x使用mitt.js进行组件通信)
- vue-router起步教程交流(vue3使用vue-router的完整步骤记录)
- vue怎么操作表格(如何在在Vue3中使用markdown 编辑器组件)
- vue2和vue3都如何创建项目(vue3.0+vite2实现动态异步组件懒加载)
- vue3函数详解(手把手教你用vue3开发一个打砖块小游戏)
- vue3 props用法(vue3组合API中setup、 ref、reactive的使用大全)
- 哪版孙悟空最萌 黄渤躺萌了(哪版孙悟空最萌)
- 融入小人物的喜怒哀乐,黄渤饰演的角色为什么让人观看时欲罢不能(融入小人物的喜怒哀乐)
- 《极限挑战》深访都市夜归人,夜间打工者体验,黄磊录完憔悴了(极限挑战深访都市夜归人)
- Google 推出了一个游戏生成器,让不会编程的你也能自己设计游戏(推出了一个游戏生成器)
- 二胎家庭老大爱闹情绪,用这招很有效(二胎家庭老大爱闹情绪)
- 一个30岁男人外遇失败的全过程(一个30岁男人外遇失败的全过程)
热门推荐
- pythonnumpy求行列式的值(Python numpy中矩阵的基本用法汇总)
- 还有什么问题要问我们的吗,如何回答
- dockerfile构建镜像两种方式(通过Dockerfile构建Docker镜像的方法步骤)
- docker如何搭建mysql(docker容器访问宿主机的MySQL操作)
- pythondict排序原理(Python标准库使用OrderedDict类的实例讲解)
- centos 测试环境搭建(centos7下安装并配置supervisor守护程序的操作方法)
- javaes6教程(如何使用ES6的class类继承来实现绚丽小球效果)
- 原生js实现轮播图代码(js实现轮播图制作方法)
- python学生管理系统的思路(python实现学员管理系统)
- eval解析json字符串
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9