最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3中ref與reactive的詳解與擴展

 更新時間:2021年06月29日 10:33:25   作者:胖笨笨先生  
在vue3中對響應(yīng)式數(shù)據(jù)的聲明官方給出了ref()和reactive()這兩種方式,下面這篇文章主要給大家介紹了關(guān)于Vue3中ref與reactive的相關(guān)資料,需要的朋友可以參考下

一、ref和reactive

死死記?。簉ef本質(zhì)也是reactive,ref(obj)等價于reactive({value: obj})

  • vue3中實現(xiàn)響應(yīng)式數(shù)據(jù)的方法是就是使用ref和reactive,所謂響應(yīng)式就是界面和數(shù)據(jù)同步,能實現(xiàn)實時更新
  • vue2中響應(yīng)式是通過defineProperty實現(xiàn)的,vue3中是通過ES6的Proxy來實現(xiàn)的

1.reactive

  • reactive的參數(shù)必須是一個對象,包括json數(shù)據(jù)和數(shù)組都可以,否則不具有響應(yīng)式
  • 如果給reactive傳遞了其他對象(如時間對象),默認情況下修改對象界面不會自動更新,如果想更新,可以通過給對象重新賦值來解決

2.ref

既然有了reactive,為何還要ref呢?當(dāng)我們只想讓某個變量實現(xiàn)響應(yīng)式的時候,采用reactive就會比較麻煩,因此vue3提供了ref方法進行簡單值的監(jiān)聽,但并不是說ref只能傳入簡單值,他的底層是reactive,所以reactive有的,他都有。還是那句老話:

死死記?。簉ef本質(zhì)也是reactive,ref(obj)等價于reactive({value: obj})

  • 在vue中使用ref的值,不用通過.value獲取
  • 在js中使用ref的值,必須通過.value獲取

二、shallowRef和shallowReactive

遞歸監(jiān)聽和非遞歸監(jiān)聽
ref和reactive都屬于遞歸監(jiān)聽,也就是數(shù)據(jù)的每一層都是響應(yīng)式的,如果數(shù)據(jù)量比較大,非常消耗性能,非遞歸監(jiān)聽只會監(jiān)聽數(shù)據(jù)的第一層。

1. ref和shallowRef

  • ref定義的數(shù)據(jù)每一層都是響應(yīng)式數(shù)據(jù)
  • shallowRef定義的數(shù)據(jù),只有第一層是響應(yīng)式的,即只有在更改.value的時候才能實現(xiàn)響應(yīng)式
let age = ref({
      a: '1',
      f: {
        b: '2',
        s:{
          c: '3'
        }
      }
    })
//打印各層數(shù)據(jù)
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'
        }
      }
    })
//打印各層數(shù)據(jù)
console.log(age);
console.log(age.value);
console.log(age.value.f);
console.log(age.value.f.s);

使用shallowRef后,可以通過triggerRef()方法主動更新界面,實現(xiàn)界面刷新

function doSome(){
  age.value.f.s.c = 'c';
  //主動更新界面
  triggerRef(age);
}

2. reactive和shallowReactive

注意:shallowReactive沒有類似triggerRef()的方法

三、toRaw

toRaw的出現(xiàn)是解決什么問題呢?

有些時候我們不希望數(shù)據(jù)進行響應(yīng)式實時更新,可以通過toRaw獲取ref或reactive引用的原始數(shù)據(jù),通過修改原始數(shù)據(jù),不會造成界面的更新,只有通過修改ref和reactive包裝后的數(shù)據(jù)時才會發(fā)生界面響應(yīng)式變化。

let obj1 = {...};
//state和obj1是引用關(guān)系,state的本質(zhì)是一個Proxy對象,其中引用了obj1
let state = reactive(obj1);
//通過toRaw方法獲取到原始數(shù)據(jù),其實是獲取到obj1的內(nèi)存地址,obj2和obj1是完全相等的
let obj2 = toRaw(state)
console.log(obj1 === obj2);//true

有些同學(xué)會問,那直接使用obj1來修改數(shù)據(jù)不就行了嗎?可關(guān)鍵是我們在使用reactive定義數(shù)據(jù)時一般不會先定義一個obj,再將他傳給reactive,都是直接在reactive中寫數(shù)據(jù)的。

四、markRaw

與toRaw不同,markRaw包裝后的數(shù)據(jù)永遠不會被追蹤!

暫時沒發(fā)現(xiàn)有什么用處(手動狗頭)

let obj1 = {name: "lijing", age: 18}
let obj2 = markRaw(obj1);
//此時reactive包裝的數(shù)據(jù)雖然是響應(yīng)式對象,但是不會被跟蹤,也不會產(chǎn)生效應(yīng)式效果
let state1 = reactive(obj2)

console.log(obj1 === obj2);//true

五、toRef和toRefs

ref和toRef都是用來構(gòu)造響應(yīng)式數(shù)據(jù),兩者有什么區(qū)別呢,看兩個例子

1. ref

復(fù)制,修改響應(yīng)式數(shù)據(jù)不會影響以前的數(shù)據(jù),數(shù)據(jù)發(fā)生改變界面就會自動更新

轉(zhuǎn)換后的是一個RefImpl類型

可以看到,使用ref對一個對象的某個簡單數(shù)據(jù)類型屬性進行響應(yīng)式改造后,通過修改響應(yīng)式數(shù)據(jù)不會影響到原始數(shù)據(jù),如上圖中,通過state1修改值后,obj1中的a屬性值沒有發(fā)生變化。這里有個注意點:修改的這個屬性必須是簡單數(shù)據(jù)類型,一個具體的值,不能是引用,如果該屬性也是一個對象,則會影響,因為對象--->引用!

例如上面例子中,如果傳入state1的是obj1.f,則情況完全不同

//等價于let state1 = ref({b: '2',s: {c: '3'}})
// 又等價于--->let state1 = reactive({value: {....}}})
let state1 = ref(obj1.f);

2.  toRef

如果使用toRef來轉(zhuǎn)換,則修改響應(yīng)式數(shù)據(jù)會影響到原始數(shù)據(jù),數(shù)據(jù)發(fā)生改變,但是界面不會自動更新

轉(zhuǎn)換后的是一個ObjectRefImpl類型

ref類似深拷貝,toref類似淺拷貝

3.  toRefs

遍歷對象中的所有屬性,將其變?yōu)轫憫?yīng)式數(shù)據(jù),這是因為toRef只能傳一個key,toRefs所達到的效果與toRef一樣

tips:目前用的最多的還是ref和reactive,其他東西一般是后期用來改善性能使用的。

總結(jié)

到此這篇關(guān)于Vue3中ref與reactive的文章就介紹到這了,更多相關(guān)Vue3 ref與reactive內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue-cli的eslint相關(guān)用法

    vue-cli的eslint相關(guān)用法

    本篇文章主要介紹了vue-cli的eslint相關(guān)用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • vue實現(xiàn)圖書管理系統(tǒng)

    vue實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了vue實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 解決vue?eslint開發(fā)嚴格模式警告錯誤的問題

    解決vue?eslint開發(fā)嚴格模式警告錯誤的問題

    這篇文章主要介紹了解決vue?eslint開發(fā)嚴格模式警告錯誤的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 使用window.open和vue router新開頁面

    使用window.open和vue router新開頁面

    這篇文章主要介紹了使用window.open和vue router新開頁面方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue組件實現(xiàn)移動端九宮格轉(zhuǎn)盤抽獎

    vue組件實現(xiàn)移動端九宮格轉(zhuǎn)盤抽獎

    這篇文章主要為大家詳細介紹了vue組件實現(xiàn)移動端九宮格轉(zhuǎn)盤抽獎,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • vant的picker的坑及解決

    vant的picker的坑及解決

    這篇文章主要介紹了vant的picker的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • webpack如何打包一個按需引入的vue組件庫

    webpack如何打包一個按需引入的vue組件庫

    在vue項目開發(fā)中,我們會將經(jīng)常用到的邏輯或模塊抽象成組件,對于那些多個項目都有用到的組件,可以考慮封裝成組件庫,這篇文章主要給大家介紹了關(guān)于webpack如何打包一個按需引入的vue組件庫的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • vue實現(xiàn)的組件兄弟間通信功能示例

    vue實現(xiàn)的組件兄弟間通信功能示例

    這篇文章主要介紹了vue實現(xiàn)的組件兄弟間通信功能,結(jié)合實例形式分析了vue兄弟組件間通信的原理與相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • 實現(xiàn)shallowReadonly和isProxy功能示例詳解

    實現(xiàn)shallowReadonly和isProxy功能示例詳解

    這篇文章主要為大家介紹了實現(xiàn)shallowReadonly和isProxy功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Vue3 computed初始化獲取設(shè)置值實現(xiàn)示例

    Vue3 computed初始化獲取設(shè)置值實現(xiàn)示例

    這篇文章主要為大家介紹了Vue3 computed初始化以及獲取值設(shè)置值實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10

最新評論

台南市| 偃师市| 河西区| 克什克腾旗| 丽江市| 铅山县| 麻栗坡县| 昆山市| 弥渡县| 大宁县| 龙南县| 彭山县| 镇原县| 库伦旗| 九台市| 台州市| 霍邱县| 和龙市| 东至县| 石楼县| 临猗县| 连南| 军事| 安多县| 石渠县| 旺苍县| 汉寿县| 玉环县| 衡水市| 白朗县| 郸城县| 丰顺县| 海城市| 贵德县| 和田县| 兴山县| 林口县| 萨嘎县| 鄄城县| 高邑县| 韶关市|