Vue中reactive和ref的用法是什么?区别在哪?
Admin 2021-10-26 群英技术资讯 1249 次浏览
本文是主要给大家介绍Vue中reactive和ref的内容,接下来会分别介绍reactive和ref的用法以及两者的区别,对大家学习和理解reactive和ref的使用有一定的参考价值,感兴趣的朋友接下跟随小编一起学习一下吧。
Ref 用来创建基础类型的响应式数据,模板默认调用value显示数据。方法中修改需要修改value的值才能修改
<!-- 模板语法> <template> <div>{{state}}</div> </template> //js 脚本 setup(){ let state = ref(10) state.value = 11 return {state} }
Reactive 用来创建引用类型的响应式数据,
<!-- 模板语法> <template> <div>{{state.name}}</div> </template> //js 脚本 setup(){ let state = reactive({name:'aaa'}}) state.name = 'zhangsan' return {state} }
Ref的本质是通过Reactive创建的,Ref(10)=>Reactive({value:10});
Ref在模板调用可以直接省略value,在方法中改变变量的值需要修改value的值,才能修改成功。Reactive在模板必须写全不然显示整个数据。
Reactive的本质是将每一层的数都解析成proxy对象,Reactive 的响应式默认都是递归的,改变某一层的值都会递归的调用一遍,重新渲染dom。
Ref与Reactive创建的都是递归响应的,将每一层的json 数据解析成一个proxy对象,shallowRef 与shallowReactive创建的是非递归的响应对象,shallowReactive创建的数据第一层数据改变会重新渲染dom
var state = shallowReactive({ a:'a', gf:{ b:'b', f:{ c:'c', s:{d:'d'} } } }) state.a = '1' //改变第一层的数据会导致页面重新渲染 //state => Proxy {a:"a",gf:{...}} //如果不改变第一层 只改变其他的数据 页面不会重新渲染 例如 state.gf.b = 2
通过shallowRef创建的响应式对象,需要修改整个value才能重新渲染dom
var state = shallowRef({ a:'a', gf:{ b:'b', f:{ c:'c', s:{d:'d'} } } }) state.value.a = 1 /* 并不能重新渲染,shallowRef的原理也是通过shallowReactive({value:{}})创建的,要修改value才能重新渲染 */ state.value = { a:'1', gf:{ b:'2', f:{ c:'3', s:{d:'d'} } } }
如果使用了shallowRef想要只更新某一层的数据可以使用triggerRef
var state = shallowRef({ a:'a', gf:{ b:'b', f:{ c:'c', s:{d:'d'} } } }) state.value.gf.f.s.d = 4 triggerRef(state)
页面就会重新渲染
如果只想修改响应式的数据不想引起页面渲染可以使用toRaw这个方法
var obj = {name:'test'} var state = reactive(obj) var obj2 = toRaw(state) obj2.name = 'zs'//并不会引起页面的渲染 ---- //如果是用ref 创建的 就要获取value值 var obj = {name:'test'} var state = ref(obj) var obj2 = toRaw(state.value)
如果不想要数据被追踪,变成响应式数据可以调用这个方法,就无法 追踪修改数据重新渲染页面
var obj = {name:'test'} obj = markRaw(obj) var state = reactive(obj) state.name = 'zs'//无法修改数据 页面也不会修改
如果使用ref 创建的响应式变量,不会与源数据关联,如果想要与源数据关联但数据更改不更新UI,就要使用toRef创建
var obj = {name:'test'} var state = ref(obj.name) state.name = 'zs' //此时obj的name 属性值并不会改变,UI会自动更新 /// var obj = {name:'test'} var state = toRef(obj,'name') //只能设置一个属性值 state.name = 'zs'//此时obj里面的name属性值会发生改变,但是UI 不会更新
如果想要设置多个toRef属性值,可以使用toRefs
var obj = {name:'test',age:16} var state = toRefs(obj) state.name.value = 'zs'//obj的name的属性值也会改变,但UI不会更新 state.age.value = 18//obj的age的属性值也会改变,但UI不会更新
通过customRef这个方法可以自定义一个响应式的ref方法
function myRef(value){ /* customRef函数返回一个对象,对象里面有2个方法,get/set方法,创建的对象获取数据的时候能 访问到get方法,
创建的对象修改值的时候会触发set 方法 customRef函数有2个参数,track/trigger,track参数是追踪的意思,get 的方法里面调用,可以随时追踪数据改变。
trigger参数 是触发响应的意思,set 方法里面调用可以更新UI界面 */ return customRef((track,trigger)=>{ return { get(){ track()//追踪数据 return value }, set(newVal){ value = newVal trigger()//更新UI界面 } } }) } setup(){ var age = myRef(18) age.value = 20 }
vue2.0 可以通过this.refs拿到dom元素,vue3取消了这一操作,没有了refs拿到dom 元素,vue3取消了这一操作,没有了refs拿到dom元素,vue3取消了这一操作,没有了refs这个属性值,可以直接用ref()方法生成响应式变量与dom 元素捆绑
<template> <div ref="box"></div> </template> import {ref,onMounted} from 'vue' /* setup 方法调用是在生命周期beforeCreate与created 之间 */ <script> setup(){ var box = ref(null) onMounted(()=>{ console.log('onMounted',box.value) }) console.log(box.value) return {box} } </script>
现在大家对reactive和ref的使用及两者的区别应该都有了解了吧,上述示例有一定的借鉴价值,有需要的朋友可以参考,希望对大家有帮助。最后,想要了解更多reactive和ref的内容,大家可以关注群英网络其它相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
现在很多账户信息注册都要求用户名唯一,也就是说用户名已经存在使用的,那么就不可再注册。因此我们在做用户注册页面时,就需要验证用户名是否可用。实现效果为,如果用户名已经存在,那么提示更换一个用户名,如果不存在那么提示用户名可用。
JavaScript实现鼠标移动事件画笔 JavaScript实现鼠标移动事件画笔小游戏,供大家参考,具体内容如下 实现功能 鼠标点击时可以在画板上画画如果鼠标双击那么停止移动进画板颜色改变移除时颜色改变 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content=" ...
这篇文章主要为大家详细介绍了vue实现树状表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
微信小程序实现上传视频功能 本文实例为大家分享了微信小程序上传视频,供大家参考,具体内容如下 微信开发者工具需要安装ffmpeg环境才能正常使用下面的官方方法. 1.调用官方提供的方法(wx.chooseMedia) choosevideo(){ let that=this console.log("上传视频的方法") wx.chooseMedia({ count: 1, //上传视频的个数 mediaType:['video'], //限制上传的类型 ...
Vue开发环境跨域访问问题,Vue开发环境跨域访问其他服务器或者本机其他端口,需要配置项目中config/index.js文件,修改如下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008