Vue3.0中Ref與Reactive的區(qū)別示例詳析
Ref與Reactive
Ref
Ref 用來創(chuàng)建基礎(chǔ)類型的響應(yīng)式數(shù)據(jù),模板默認(rèn)調(diào)用value顯示數(shù)據(jù)。方法中修改需要修改value的值才能修改
<!-- 模板語法> <template> <div>{{state}}</div> </template> //js 腳本 setup(){ let state = ref(10) state.value = 11 return {state} }
Reactive
Reactive 用來創(chuàng)建引用類型的響應(yīng)式數(shù)據(jù),
<!-- 模板語法> <template> <div>{{state.name}}</div> </template> //js 腳本 setup(){ let state = reactive({name:'aaa'}}) state.name = 'zhangsan' return {state} }
Ref與Reactive的區(qū)別
Ref的本質(zhì)是通過Reactive創(chuàng)建的,Ref(10)=>Reactive({value:10});
Ref在模板調(diào)用可以直接省略value,在方法中改變變量的值需要修改value的值,才能修改成功。Reactive在模板必須寫全不然顯示整個數(shù)據(jù)。
Reactive的本質(zhì)是將每一層的數(shù)都解析成proxy對象,Reactive 的響應(yīng)式默認(rèn)都是遞歸的,改變某一層的值都會遞歸的調(diào)用一遍,重新渲染dom。
shallowRef 與shallowReactive
Ref與Reactive創(chuàng)建的都是遞歸響應(yīng)的,將每一層的json 數(shù)據(jù)解析成一個proxy對象,shallowRef 與shallowReactive創(chuàng)建的是非遞歸的響應(yīng)對象,shallowReactive創(chuàng)建的數(shù)據(jù)第一層數(shù)據(jù)改變會重新渲染dom
var state = shallowReactive({ a:'a', gf:{ b:'b', f:{ c:'c', s:{d:'d'} } } }) state.a = '1' //改變第一層的數(shù)據(jù)會導(dǎo)致頁面重新渲染 //state => Proxy {a:"a",gf:{...}} //如果不改變第一層 只改變其他的數(shù)據(jù) 頁面不會重新渲染 例如 state.gf.b = 2
通過shallowRef創(chuàng)建的響應(yīng)式對象,需要修改整個value才能重新渲染dom
var state = shallowRef({ a:'a', gf:{ b:'b', f:{ c:'c', s:{d:'d'} } } }) state.value.a = 1 /* 并不能重新渲染,shallowRef的原理也是通過shallowReactive({value:{}})創(chuàng)建的,要修改value才能重新渲染 */ state.value = { a:'1', gf:{ b:'2', f:{ c:'3', s:{d:'d'} } } }
如果使用了shallowRef想要只更新某一層的數(shù)據(jù)可以使用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 ---只修改數(shù)據(jù)不渲染頁面
如果只想修改響應(yīng)式的數(shù)據(jù)不想引起頁面渲染可以使用toRaw這個方法
var obj = {name:'test'} var state = reactive(obj) var obj2 = toRaw(state) obj2.name = 'zs'//并不會引起頁面的渲染 ---- //如果是用ref 創(chuàng)建的 就要獲取value值 var obj = {name:'test'} var state = ref(obj) var obj2 = toRaw(state.value)
markRaw --- 不追蹤數(shù)據(jù)
如果不想要數(shù)據(jù)被追蹤,變成響應(yīng)式數(shù)據(jù)可以調(diào)用這個方法,就無法 追蹤修改數(shù)據(jù)重新渲染頁面
var obj = {name:'test'} obj = markRaw(obj) var state = reactive(obj) state.name = 'zs'//無法修改數(shù)據(jù) 頁面也不會修改
toRef --- 跟數(shù)據(jù)源關(guān)聯(lián) 不修改UI
如果使用ref 創(chuàng)建的響應(yīng)式變量,不會與源數(shù)據(jù)關(guān)聯(lián),如果想要與源數(shù)據(jù)關(guān)聯(lián)但數(shù)據(jù)更改不更新UI,就要使用toRef創(chuàng)建
var obj = {name:'test'} var state = ref(obj.name) state.name = 'zs' //此時obj的name 屬性值并不會改變,UI會自動更新 /// var obj = {name:'test'} var state = toRef(obj,'name') //只能設(shè)置一個屬性值 state.name = 'zs'//此時obj里面的name屬性值會發(fā)生改變,但是UI 不會更新
toRefs ---設(shè)置多個toRef屬性值
如果想要設(shè)置多個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這個方法可以自定義一個響應(yīng)式的ref方法
function myRef(value){ /* customRef函數(shù)返回一個對象,對象里面有2個方法,get/set方法,創(chuàng)建的對象獲取數(shù)據(jù)的時候能 訪問到get方法,創(chuàng)建的對象修改值的時候會觸發(fā)set 方法 customRef函數(shù)有2個參數(shù),track/trigger,track參數(shù)是追蹤的意思,get 的方法里面調(diào)用,可以隨時追蹤數(shù)據(jù)改變。trigger參數(shù) 是觸發(fā)響應(yīng)的意思,set 方法里面調(diào)用可以更新UI界面 */ return customRef((track,trigger)=>{ return { get(){ track()//追蹤數(shù)據(jù) return value }, set(newVal){ value = newVal trigger()//更新UI界面 } } }) } setup(){ var age = myRef(18) age.value = 20 }
ref 捆綁頁面的標(biāo)簽
vue2.0 可以通過this.refs拿到dom元素,vue3取消了這一操作,沒有了refs拿到dom 元素,vue3取消了這一操作,沒有了refs拿到dom元素,vue3取消了這一操作,沒有了refs這個屬性值,可以直接用ref()方法生成響應(yīng)式變量與dom 元素捆綁
<template> <div ref="box"></div> </template> import {ref,onMounted} from 'vue' /* setup 方法調(diào)用是在生命周期beforeCreate與created 之間 */ <script> setup(){ var box = ref(null) onMounted(()=>{ console.log('onMounted',box.value) }) console.log(box.value) return {box} } </script>
總結(jié)
到此這篇關(guān)于Vue3.0中Ref與Reactive區(qū)別的文章就介紹到這了,更多相關(guān)Vue3.0 Ref與Reactive區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3?中ref和reactive的區(qū)別講解
- 前端vue3中的ref與reactive用法及區(qū)別總結(jié)
- Vue3 的ref和reactive的用法和區(qū)別示例解析
- Vue3中ref和reactive的基本使用及區(qū)別詳析
- Vue3中ref和reactive的區(qū)別及說明
- vue3.0中ref與reactive的區(qū)別及使用場景分析
- Vue3中關(guān)于ref和reactive的區(qū)別分析
- vue3中reactive和ref的實現(xiàn)與區(qū)別詳解
- vue3 ref 和reactive的區(qū)別詳解
- vue3中ref和reactive的區(qū)別舉例詳解
相關(guān)文章
van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)
前端開發(fā)想省時間就是要找框架呀,下面這篇文章主要給大家介紹了關(guān)于van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù),文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06詳解如何將 Vue-cli 改造成支持多頁面的 history 模式
本篇文章主要介紹了詳解如何將 Vue-cli 改造成支持多頁面的 history 模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Vue?3?表格時間監(jiān)控與動態(tài)后端請求觸發(fā)詳解?附Demo展示
在Vue3中,使用el-table組件渲染表格數(shù)據(jù),通過el-table-column指定內(nèi)容,時間點需前端校準(zhǔn),用getTime()比較,到達(dá)時觸發(fā)操作,異步API請求可用async/await處理,setInterval實現(xiàn)定時監(jiān)控,配合條件判斷防止重復(fù)請求2024-09-09