vue中的ref(Vue3.0中Ref与Reactive的区别示例详析)
vue中的ref
Vue3.0中Ref与Reactive的区别示例详析目录
- Ref与Reactive
- Ref
- Reactive
- Ref与Reactive的区别
- shallowRef 与shallowReactive
- toRaw ---只修改数据不渲染页面
- markRaw --- 不追踪数据
- toRef --- 跟数据源关联 不修改UI
- toRefs ---设置多个toRef属性值
- customRef ---自定义一个ref
- ref 捆绑页面的标签
- 总结
Ref
Ref 用来创建基础类型的响应式数据,模板默认调用value显示数据。方法中修改需要修改value的值才能修改
<!-- 模板语法> <template> <li>{{state}}</li> </template> //js 脚本 setup(){ let state = ref(10) state.value = 11 return {state} }
Reactive
Reactive 用来创建引用类型的响应式数据,
<!-- 模板语法> <template> <li>{{state.name}}</li> </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。
shallowRef 与shallowReactiveRef与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 ---只修改数据不渲染页面
如果只想修改响应式的数据不想引起页面渲染可以使用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)
markRaw --- 不追踪数据
如果不想要数据被追踪,变成响应式数据可以调用这个方法,就无法 追踪修改数据重新渲染页面
var obj = {name:'test'} obj = markRaw(obj) var state = reactive(obj) state.name = 'zs'//无法修改数据 页面也不会修改
toRef --- 跟数据源关联 不修改UI
如果使用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 不会更新
toRefs ---设置多个toRef属性值
如果想要设置多个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
通过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 }
ref 捆绑页面的标签
vue2.0 可以通过this.refs拿到dom元素,vue3取消了这一操作,没有了refs拿到dom 元素,vue3取消了这一操作,没有了refs拿到dom元素,vue3取消了这一操作,没有了refs这个属性值,可以直接用ref()方法生成响应式变量与dom 元素捆绑
<template> <li ref="box"></li> </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>
到此这篇关于Vue3.0中Ref与Reactive区别的文章就介绍到这了,更多相关Vue3.0 Ref与Reactive区别内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- vue3.0带参数的方法(Vue3中ref与toRef的区别浅析)
- vue3.0全家桶教程elementui学习(vite+vue3.0+ts+element-plus快速搭建项目的实现)
- vue函数中的默认参数(Vue3中SetUp函数的参数props、context详解)
- vue可以用vite打包吗(vite+vue3+element-plus项目搭建的方法步骤)
- electronvue最新版本(Vue3和Electron实现桌面端应用详解)
- vue3 兄弟组件(vue3如何按需加载第三方组件库详解)
- vue3函数详解(手把手教你用vue3开发一个打砖块小游戏)
- vue-router起步教程交流(vue3使用vue-router的完整步骤记录)
- vue3组件通讯消息(Vue3实现Message消息组件示例)
- vue2和vue3都如何创建项目(vue3.0+vite2实现动态异步组件懒加载)
- vue3 ref 的用法(Vue3中watchEffect的用途浅析)
- vue3.0路线图(Vue3.0 自己实现放大镜效果案例讲解)
- vuejs过滤器使用教程(vue3删除过滤器的原因)
- vue前端搜索功能如何实现(使用Vue3+Vant组件实现App搜索历史记录功能示例代码)
- vue3.0 黑暗风格(Vue3.0 手写放大镜效果)
- vue的watch用法(Vue3中watch的用法与最佳实践指南)
- 保温好 容量大 颜值高 保温杯你给娃娃买对了吗(保温好容量大颜值高)
- 《道德经》 人生避开骄狂,才能免去祸患(道德经人生避开骄狂)
- 郭麒麟(郭麒麟)
- 古人十句 戒骄 名言,醍醐灌顶,受益匪浅(古人十句戒骄名言)
- 《道德经》:功成不局,泰而不骄(道德经:功成不局)
- 每日一典 过江之鲫(每日一典过江之鲫)
热门推荐
- html5 spellcheck属性
- css竖排显示技巧(css魔法之左边竖条的多种实现方法)
- 云服务器租用需要注意什么(网站云主机租赁时需要注意哪些事项?)
- 简述python2与python3的不同点(Python2与Python3的区别实例分析)
- python的def命令参数(python ddt数据驱动最简实例代码)
- sql查询地址中包含某个字段(SQL查询字段被包含语句)
- thinkphp微信开发教程(微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解)
- php字符串长度怎么获取(PHP实现给定一列字符,生成指定长度的所有可能组合示例)
- 微信小程序中的代码怎么编辑(微信小程序新手入门之自定义组件的使用)
- jquery 增加表格(jquery实现表格无缝滚动)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9