vue3響應(yīng)式對象的api超全實例詳解
Ⅰ. ref、reactive ( 遞歸監(jiān)聽 )
import {ref,reactive} from 'vue';
setup() {
const num = ref(123);
num.value = 456;
const obj = reactive({num:123});
obj.value = 456;
}- ref 對象 在 html 模板中會 自動添加 value ( ref 對象中__v_isRef:true 進行判斷的 )
- ref 對象 => reactive( { value:0 } ) 底層自動轉(zhuǎn)換為 reactive
- 最終 基本數(shù)據(jù) 類型采用 => (Object.defineProperty) ,引用數(shù)據(jù) 類型采用 => ( proxy 代理 )
Ⅱ. isRef、isReactive ( 判斷 )
import {isRef,isReactive} from 'vue';
setup() {
const num = ref(123)
console.log(isRef(num)) // => true
}- 用于判斷是否是 Ref 和 Reactive 創(chuàng)建的響應(yīng)對象
- 使用場景較少
Ⅲ. toRef 和 toRefs ( 解構(gòu) )
toRef (一個屬性)
import { toRef , reactive } from 'vue';
setup() {
const obj = reactive({ width:10, height:20 })
const width = toRef(obj,'width')
return {
width
}
}將一個響應(yīng)對象的屬性,當作 響應(yīng)對象 單獨拿出來 。
toRefs ( 所有 )
import { toRefs , reactive } from 'vue';
setup() {
const obj = reactive({ width:10, height:20 })
const { width, height }= toRefs(obj)
return {
width, height
}
}將多個或所有屬性,拿出來 且還是響應(yīng)對象,一般在返回的時候一次性全部導出 ??
import { toRefs , reactive } from 'vue';
setup() {
const obj = reactive({ width:10, height:20 })
return {
...toRefs(obj)
}
}Ⅳ. toRaw 、 markRaw ( 解除代理)
toRaw ( 不影響本身 )
import {toRaw} from 'vue';
setup(){
const num1 = ref(123)
const num2 = toRaw(num1)
console.log(num2 === 123) //=>true
}- 不影響原數(shù)據(jù) ,相當于拷貝當前的值
- 拷貝的值,不在是響應(yīng)式對象
markRaw ( 添加 非響應(yīng)對象 屬性 )
import { markRaw, reactive } from "vue";
setup(){
const obj = reactive({ num:1 }); //讓數(shù)據(jù)無法被追蹤
obj.noUpdate = markRaw({num:1});
function add() {
obj.num++; // 頁面數(shù)據(jù) 會更新
obj.noUpdate.num++; //頁面數(shù)據(jù) 不會更新
}
return { obj , add }
}- 通過 markRaw 添加的值 => 其中的屬性變化,頁面不會監(jiān)聽的到
- 用于添加搞定的參數(shù),不會發(fā)生不會的 ( 從而節(jié)約資源 )
Ⅴ. unref ( 拷貝 )
const aaa = ref('abc');
const bbb = unref(aaa); - 相當于 bbb = isRef(aaa) ? aaa.value : aaa 的語法糖
- 可以用于拷貝
Ⅵ. shallowRef 、shallowReactive( 非遞歸監(jiān)聽 )
shallowRef 、shallowReactive(非遞歸監(jiān)聽)
import {shallowRef,shallowReactive} from 'vue';
setup(){
const obj1 = shallowRef({a:1,b:{c:2})
const obj2 = shallowReactive({a:1,b:{c:2})
obj1.value.a = 2 //頁面未更新
obj2.b.c = 3 //頁面未更新
}- obj1 (shallowRef)=> 只監(jiān)聽第一層( value 的值,不監(jiān)聽a、b、c、d 的值)
- obj2 (shallowReactive)=> 只監(jiān)聽第一層( a、b 的值,不監(jiān)聽 c 的值)
Ⅶ. triggerRef (強制更新)
import {triggerRef, shallowRef} from 'vue';
setup(){
const obj1 = shallowRef({a:1,b:{c:2})
obj1.value.a = 2 //頁面沒有發(fā)生更新,因為只監(jiān)聽value第一層
triggerRef(obj1); // 強制更新非遞歸監(jiān)聽,只監(jiān)聽首層 ,消耗的資源?。慌浜?triggerRef 強制更新 => 性能要大于 > 直接使用 (ref 和 reactive)
總結(jié)
到此這篇關(guān)于vue3響應(yīng)式對象的api的文章就介紹到這了,更多相關(guān)vue3響應(yīng)式對象api內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue父子組件方法this.$emit()有時候不觸發(fā)問題及解決
這篇文章主要介紹了Vue父子組件方法this.$emit()有時候不觸發(fā)問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Vue前端左側(cè)菜單右側(cè)內(nèi)容的網(wǎng)站界面制作過程
這篇文章主要介紹了使用Vue和ElementUI制作一個帶有左側(cè)菜單和右側(cè)內(nèi)容區(qū)的網(wǎng)站頁面的過程,文中通過CSS樣式和深度作用符,實現(xiàn)了頁面的美化和功能的完善,需要的朋友可以參考下2025-02-02
vue 使用lodash實現(xiàn)對象數(shù)組深拷貝操作
這篇文章主要介紹了vue 使用lodash實現(xiàn)對象數(shù)組深拷貝操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
一步步從Vue3.x源碼上理解ref和reactive的區(qū)別
vue3的數(shù)據(jù)雙向綁定,大家都明白是proxy數(shù)據(jù)代理,但是在定義響應(yīng)式數(shù)據(jù)的時候,有ref和reactive兩種方式,如果判斷該使用什么方式,是大家一直不很清楚地問題,下面這篇文章主要給大家介紹了關(guān)于從Vue3.x源碼上理解ref和reactive的區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-02-02
vant/vue手機端長按事件以及禁止長按彈出菜單實現(xiàn)方法詳解
這篇文章主要介紹了vant/vue手機端長按事件以及禁止長按彈出菜單實現(xiàn)方法詳解,需要的朋友可以參考下2022-12-12
laravel-admin 與 vue 結(jié)合使用實例代碼詳解
由于 Laravel-admin 采用的是 pjax 的方式刷新頁面,意味著很多頁面刷新的操作,這篇文章主要介紹了laravel-admin 與 vue 結(jié)合使用,需要的朋友可以參考下2019-06-06
vue使用better-scroll實現(xiàn)下拉刷新、上拉加載
這篇文章主要為大家詳細介紹了vue使用better-scroll實現(xiàn)下拉刷新、上拉加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11

