欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3.0中Ref與Reactive的區(qū)別示例詳析

 更新時(shí)間:2021年07月07日 11:57:23   作者:Try to do  
在vue3中對(duì)響應(yīng)式數(shù)據(jù)的聲明官方給出了ref()和reactive()這兩種方式,這篇文章主要給大家介紹了關(guān)于Vue3.0中Ref與Reactive區(qū)別的相關(guān)資料,需要的朋友可以參考下

Ref與Reactive

Ref

Ref 用來(lái)創(chuàng)建基礎(chǔ)類型的響應(yīng)式數(shù)據(jù),模板默認(rèn)調(diào)用value顯示數(shù)據(jù)。方法中修改需要修改value的值才能修改

<!-- 模板語(yǔ)法> 
<template>
   <div>{{state}}</div>
</template> 
//js 腳本
setup(){
     let state = ref(10) 
     state.value = 11
     return {state}
}

Reactive

Reactive 用來(lái)創(chuàng)建引用類型的響應(yīng)式數(shù)據(jù),

<!-- 模板語(yǔ)法> 
<template>
   <div>{{state.name}}</div>
</template> 
//js 腳本
setup(){
     let state = reactive({name:'aaa'}}) 
     state.name = 'zhangsan'
     return {state}
}

Ref與Reactive的區(qū)別

Ref的本質(zhì)是通過(guò)Reactive創(chuàng)建的,Ref(10)=>Reactive({value:10});

Ref在模板調(diào)用可以直接省略value,在方法中改變變量的值需要修改value的值,才能修改成功。Reactive在模板必須寫全不然顯示整個(gè)數(shù)據(jù)。

Reactive的本質(zhì)是將每一層的數(shù)都解析成proxy對(duì)象,Reactive 的響應(yīng)式默認(rèn)都是遞歸的,改變某一層的值都會(huì)遞歸的調(diào)用一遍,重新渲染dom。

shallowRef 與shallowReactive

Ref與Reactive創(chuàng)建的都是遞歸響應(yīng)的,將每一層的json 數(shù)據(jù)解析成一個(gè)proxy對(duì)象,shallowRef 與shallowReactive創(chuàng)建的是非遞歸的響應(yīng)對(duì)象,shallowReactive創(chuàng)建的數(shù)據(jù)第一層數(shù)據(jù)改變會(huì)重新渲染dom

 var state = shallowReactive({
    a:'a',
    gf:{
       b:'b',
       f:{
          c:'c',
          s:{d:'d'}
       }
    }
 })
 state.a = '1'
 //改變第一層的數(shù)據(jù)會(huì)導(dǎo)致頁(yè)面重新渲染
 //state => Proxy {a:"a",gf:{...}}
//如果不改變第一層 只改變其他的數(shù)據(jù) 頁(yè)面不會(huì)重新渲染 例如 state.gf.b = 2

通過(guò)shallowRef創(chuàng)建的響應(yīng)式對(duì)象,需要修改整個(gè)value才能重新渲染dom

var state = shallowRef({
   a:'a',
    gf:{
       b:'b',
       f:{
          c:'c',
          s:{d:'d'}
       }
    }
})
state.value.a = 1
/*
并不能重新渲染,shallowRef的原理也是通過(guò)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)

頁(yè)面就會(huì)重新渲染

toRaw ---只修改數(shù)據(jù)不渲染頁(yè)面

如果只想修改響應(yīng)式的數(shù)據(jù)不想引起頁(yè)面渲染可以使用toRaw這個(gè)方法

var obj = {name:'test'}
var state = reactive(obj)
var obj2 = toRaw(state)
obj2.name = 'zs'//并不會(huì)引起頁(yè)面的渲染

----
//如果是用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)用這個(gè)方法,就無(wú)法 追蹤修改數(shù)據(jù)重新渲染頁(yè)面

var obj = {name:'test'}
obj = markRaw(obj)
var state = reactive(obj)
state.name = 'zs'//無(wú)法修改數(shù)據(jù) 頁(yè)面也不會(huì)修改

toRef --- 跟數(shù)據(jù)源關(guān)聯(lián) 不修改UI

如果使用ref 創(chuàng)建的響應(yīng)式變量,不會(huì)與源數(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' //此時(shí)obj的name 屬性值并不會(huì)改變,UI會(huì)自動(dòng)更新

///
var obj = {name:'test'}
var state = toRef(obj,'name') //只能設(shè)置一個(gè)屬性值
state.name = 'zs'//此時(shí)obj里面的name屬性值會(huì)發(fā)生改變,但是UI 不會(huì)更新

toRefs ---設(shè)置多個(gè)toRef屬性值

如果想要設(shè)置多個(gè)toRef屬性值,可以使用toRefs

var obj = {name:'test',age:16}
var state = toRefs(obj)
state.name.value = 'zs'//obj的name的屬性值也會(huì)改變,但UI不會(huì)更新
state.age.value = 18//obj的age的屬性值也會(huì)改變,但UI不會(huì)更新

customRef ---自定義一個(gè)ref

通過(guò)customRef這個(gè)方法可以自定義一個(gè)響應(yīng)式的ref方法

function myRef(value){
   /*
    customRef函數(shù)返回一個(gè)對(duì)象,對(duì)象里面有2個(gè)方法,get/set方法,創(chuàng)建的對(duì)象獲取數(shù)據(jù)的時(shí)候能 訪問(wèn)到get方法,創(chuàng)建的對(duì)象修改值的時(shí)候會(huì)觸發(fā)set 方法
    customRef函數(shù)有2個(gè)參數(shù),track/trigger,track參數(shù)是追蹤的意思,get 的方法里面調(diào)用,可以隨時(shí)追蹤數(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 捆綁頁(yè)面的標(biāo)簽

vue2.0 可以通過(guò)this.refs拿到dom元素,vue3取消了這一操作,沒有了refs拿到dom 元素,vue3取消了這一操作,沒有了refs拿到dom元素,vue3取消了這一操作,沒有了refs這個(gè)屬性值,可以直接用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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 手動(dòng)掛載Vue3.0組件到DOM節(jié)點(diǎn)的方法

    手動(dòng)掛載Vue3.0組件到DOM節(jié)點(diǎn)的方法

    在VUE應(yīng)用中,經(jīng)常會(huì)使用一些非vue實(shí)現(xiàn)的js庫(kù),這些js庫(kù)可能要求外部傳入一些界面DOM節(jié)點(diǎn),本文主要介紹了手動(dòng)掛載Vue3.0組件到DOM節(jié)點(diǎn)的方法,感興趣的可以了解一下
    2024-08-08
  • van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)

    van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)

    前端開發(fā)想省時(shí)間就是要找框架呀,下面這篇文章主要給大家介紹了關(guān)于van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 解決Vue打包后訪問(wèn)圖片/圖標(biāo)不顯示的問(wèn)題

    解決Vue打包后訪問(wèn)圖片/圖標(biāo)不顯示的問(wèn)題

    這篇文章主要介紹了 解決Vue打包后訪問(wèn)圖片/圖標(biāo)不顯示的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考解決價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 詳解如何將 Vue-cli 改造成支持多頁(yè)面的 history 模式

    詳解如何將 Vue-cli 改造成支持多頁(yè)面的 history 模式

    本篇文章主要介紹了詳解如何將 Vue-cli 改造成支持多頁(yè)面的 history 模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 在Vue項(xiàng)目中優(yōu)化字體文件的加載和緩存的常用方法

    在Vue項(xiàng)目中優(yōu)化字體文件的加載和緩存的常用方法

    在現(xiàn)代 Web 開發(fā)中,字體文件通常是頁(yè)面加載時(shí)間的重要因素之一,特別是在字體文件較大或網(wǎng)絡(luò)環(huán)境不佳的情況下,用戶體驗(yàn)可能會(huì)受到影響,本文將詳細(xì)探討如何在 Vue.js 項(xiàng)目中優(yōu)化字體文件的加載和緩存,以提高頁(yè)面性能,需要的朋友可以參考下
    2024-09-09
  • 實(shí)現(xiàn)elementUI表單的全局驗(yàn)證的方法步驟

    實(shí)現(xiàn)elementUI表單的全局驗(yàn)證的方法步驟

    這篇文章主要介紹了實(shí)現(xiàn)elementUI表單的全局驗(yàn)證的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • vue中el-table合并列的具體實(shí)現(xiàn)

    vue中el-table合并列的具體實(shí)現(xiàn)

    本文主要介紹了vue中el-table合并列的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue如何在多個(gè)不同服務(wù)器下訪問(wèn)不同地址

    vue如何在多個(gè)不同服務(wù)器下訪問(wèn)不同地址

    這篇文章主要介紹了vue如何在多個(gè)不同服務(wù)器下訪問(wèn)不同地址,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue封裝第三方插件并發(fā)布到npm的方法

    vue封裝第三方插件并發(fā)布到npm的方法

    本篇文章主要介紹了vue封裝第三方插件并發(fā)布到npm的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Vue?3?表格時(shí)間監(jiān)控與動(dòng)態(tài)后端請(qǐng)求觸發(fā)詳解?附Demo展示

    Vue?3?表格時(shí)間監(jiān)控與動(dòng)態(tài)后端請(qǐng)求觸發(fā)詳解?附Demo展示

    在Vue3中,使用el-table組件渲染表格數(shù)據(jù),通過(guò)el-table-column指定內(nèi)容,時(shí)間點(diǎn)需前端校準(zhǔn),用getTime()比較,到達(dá)時(shí)觸發(fā)操作,異步API請(qǐng)求可用async/await處理,setInterval實(shí)現(xiàn)定時(shí)監(jiān)控,配合條件判斷防止重復(fù)請(qǐng)求
    2024-09-09

最新評(píng)論