自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一網(wǎng)打盡──Vue3 Composition-api新特性

開(kāi)發(fā) 前端
本篇帶大家詳細(xì)了解一下關(guān)于Vue3 Composition-api新特性,在體驗(yàn)Vue3之前,我們先來(lái)了解一下Vu3到底有哪些亮點(diǎn)之處。

[[416771]]

寫(xiě)在前面

在體驗(yàn)Vue3之前,我們先來(lái)了解一下Vu3到底有哪些亮點(diǎn)之處。

總共有6大特點(diǎn):

  • Performance(性能比vue2的runtime快2倍左右)
  • Tree shaking support(按需打包模塊)
  • Better TypeScript support(更好的TS代碼支持)
  • Composition API(組合API)
  • Custom Renderer API(自定義渲染API)
  • Fragment, Teleport, Suspense

一、vue3的起源setup

1.理解:vue3.0的組合api舞臺(tái)是setup

2.setup所有的數(shù)據(jù)方法等都配置在setup中

3.setup有兩種返回值:

  • 若返回一個(gè)對(duì)象,則對(duì)象中的屬性、方法,在模板中均可直接使用
  • 若返回一個(gè)渲染函數(shù),則可以自定義渲染內(nèi)容

4.注意:

  • vue3.0盡量不要和vue2的配置混用
  • vue2配置(data、methods、computed等)是可以訪問(wèn)vue3的setup屬性方法
  • setup中不可訪問(wèn)vue2的配置(data、methods、computed等)
  • 如果重名,則vue3為準(zhǔn)

5.setup不能是一個(gè)async函數(shù),因?yàn)榉祷刂挡辉偈莚eturn的對(duì)象,而是promise,模板看不到return對(duì)象中的屬性(后期也可以使用suspense和異步組件的配合得到promise)

二、ref函數(shù)

作用:用于定義一個(gè)響應(yīng)式數(shù)據(jù)

語(yǔ)法:const name = ref(initValue)

  • 創(chuàng)建一個(gè)包含響應(yīng)式數(shù)據(jù)的引用對(duì)象(reference對(duì)象,簡(jiǎn)稱(chēng)ref對(duì)象)
  • js中操作數(shù)據(jù):name.value
  • 模板中讀取數(shù)據(jù):不需要value,直接<div>{{name}}</div>

注意:

  • 接受的數(shù)據(jù):基本類(lèi)型、對(duì)象類(lèi)型
  • 基本數(shù)據(jù)類(lèi)型:響應(yīng)式是靠Object.defineProperty()的get與set進(jìn)行設(shè)置和取值操作
  • 對(duì)象類(lèi)型的數(shù)據(jù):內(nèi)部使用了vue3中的新函數(shù)--reactive函數(shù)(其實(shí)就是proxy代理)

三、reactive函數(shù)

  • 作用:用于定義一個(gè)對(duì)象類(lèi)型的響應(yīng)式數(shù)據(jù)(基本類(lèi)型不要用它,要用ref函數(shù))
  • 語(yǔ)法:const 代理對(duì)象(proxy) = reactive(源對(duì)象)接收一個(gè)對(duì)象或數(shù)組,返回一個(gè)代理對(duì)象(proxy的實(shí)例對(duì)象,簡(jiǎn)稱(chēng)proxy對(duì)象)
  • reactive定義的響應(yīng)式是『深層次的』,對(duì)象中的所有對(duì)象都是響應(yīng)式的
  • 內(nèi)部基于es6的proxy實(shí)現(xiàn),通過(guò)代理對(duì)象內(nèi)部數(shù)據(jù)進(jìn)行操作
  • 經(jīng)過(guò)reactive處理的對(duì)象是不能使用解構(gòu)語(yǔ)法的,因?yàn)闀?huì)失去響應(yīng)式特性,可以使用toRefs將reactive每個(gè)屬性都轉(zhuǎn)成ref響應(yīng)式,這樣就可以進(jìn)行響應(yīng)式處理。

ref和reactive的差異

reactive就是用于將對(duì)象數(shù)據(jù)轉(zhuǎn)為響應(yīng)式,與vue2的observable類(lèi)似,而ref用于獲得單獨(dú)或?yàn)榛A(chǔ)數(shù)據(jù)類(lèi)型轉(zhuǎn)為響應(yīng)式。

為什么在vue3中會(huì)有兩個(gè)將數(shù)據(jù)轉(zhuǎn)為響應(yīng)式數(shù)據(jù)的api,我們來(lái)進(jìn)行詳細(xì)說(shuō)明:

  • ref接受一個(gè)內(nèi)部值并返回一個(gè)響應(yīng)式且可變的ref對(duì)象,對(duì)象具有指向內(nèi)部值的單個(gè)property.value
  • reactive接受一個(gè)對(duì)象,并返回對(duì)象的響應(yīng)式副本,其將對(duì)象中的每個(gè)元素都轉(zhuǎn)為ref對(duì)象

簡(jiǎn)而言之,reactive可以將對(duì)象數(shù)據(jù)轉(zhuǎn)為響應(yīng)式,可以將對(duì)象中的每個(gè)元素都轉(zhuǎn)為ref響應(yīng)式數(shù)據(jù);而ref不僅可以將對(duì)象數(shù)據(jù)轉(zhuǎn)為響應(yīng)式,還可以處理基礎(chǔ)數(shù)據(jù)類(lèi)型(string、boolean等)。

之所以會(huì)有此差異,那時(shí)因?yàn)関ue3中的響應(yīng)式是基于proxy實(shí)現(xiàn)的,而對(duì)于proxy的target必須是引用數(shù)據(jù)類(lèi)型,即存放在堆內(nèi)存中通過(guò)指針進(jìn)行引用的對(duì)象。為什么是代理的引用數(shù)據(jù)類(lèi)型,那是因?yàn)楹?jiǎn)單數(shù)據(jù)類(lèi)型每次賦值都是全新的數(shù)據(jù),根本無(wú)法進(jìn)行代理,因此難以實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)類(lèi)型的響應(yīng)式。

如果我們想要獲取簡(jiǎn)單數(shù)據(jù)類(lèi)型的響應(yīng)式,應(yīng)該如何做呢?

vue3中也考慮到這點(diǎn),可以通過(guò)ref進(jìn)行簡(jiǎn)單數(shù)據(jù)類(lèi)型的響應(yīng)式處理。ref通過(guò)創(chuàng)建內(nèi)部狀態(tài),將值掛到value上,因此ref生成的對(duì)象要通過(guò).value獲取使用。而重寫(xiě)get/set獲得的監(jiān)聽(tīng),同時(shí)對(duì)對(duì)象的處理也依賴(lài)了reactive的實(shí)現(xiàn)。

正是如此,ref既可以處理簡(jiǎn)單數(shù)據(jù)類(lèi)型,又可以將引用數(shù)據(jù)類(lèi)型進(jìn)行響應(yīng)式處理。在實(shí)踐中,我們應(yīng)該避免將reactive當(dāng)作vue2的data在頂部將所有變量進(jìn)行聲明,而是應(yīng)該結(jié)合具體的應(yīng)用和邏輯進(jìn)行就近聲明。

  1. class RefImpl<T> { 
  2.   private _value: T 
  3.  
  4.   public readonly __v_isRef = true 
  5.  
  6.   constructor(private _rawValue: T, public readonly _shallow = false) { 
  7.     this._value = _shallow ? _rawValue : convert(_rawValue) 
  8.   } 
  9.  
  10.   get value() { 
  11.     track(toRaw(this), TrackOpTypes.GET, 'value'
  12.     return this._value 
  13.   } 
  14.  
  15.   set value(newVal) { 
  16.     if (hasChanged(toRaw(newVal), this._rawValue)) { 
  17.       this._rawValue = newVal 
  18.       this._value = this._shallow ? newVal : convert(newVal) 
  19.       trigger(toRaw(this), TriggerOpTypes.SET'value', newVal) 
  20.     } 
  21.   } 
  22. ... 
  23. const convert = <T extends unknown>(val: T): T => 
  24.   isObject(val) ? reactive(val) : val 
  25. ... 

四、Vue3中的響應(yīng)式原理

vue2的響應(yīng)式原理:

  • 對(duì)象類(lèi)型:通過(guò)Object.defineProperty()對(duì)屬性的讀取、修改進(jìn)行攔截(數(shù)據(jù)劫持)
  • 數(shù)組類(lèi)型:通過(guò)重寫(xiě)更新數(shù)組的一系列方法來(lái)實(shí)現(xiàn)攔截。(對(duì)數(shù)組的變更方法進(jìn)行包裹)
  1. Object.defineProperty(data,"count",{ 
  2.   get(){}, 
  3.   set(){} 
  4. }) 

存在問(wèn)題:

  • 新增屬性、刪除屬性,界面不會(huì)同步更新
  • 直接通過(guò)下表修改數(shù)組,界面不會(huì)自動(dòng)更新

vue3的響應(yīng)式原理

  • 通過(guò)proxy代理:攔截對(duì)象中任意屬性的變化,包括:屬性值的讀寫(xiě)、屬性值的添加、刪除等
  • 通過(guò)reflect反射:對(duì)被代理對(duì)象的屬性進(jìn)行操作

五、reactive和ref的差異

定義數(shù)據(jù)

  • ref:用于定義基本數(shù)據(jù)類(lèi)型
  • reactive:用于定義引用數(shù)據(jù)類(lèi)型
  • 注意:ref也可以用于定義引用數(shù)據(jù)類(lèi)型,內(nèi)部會(huì)自動(dòng)通過(guò)ractive轉(zhuǎn)為代理對(duì)象

原理

  • ref:通過(guò)Object.defineProperty()的set和get屬性實(shí)現(xiàn)響應(yīng)式(數(shù)據(jù)劫持)
  • reactive:通過(guò)Proxy來(lái)實(shí)現(xiàn)響應(yīng)式(數(shù)據(jù)劫持),并通過(guò)Reflect操作愿對(duì)象內(nèi)部的數(shù)據(jù)

使用

  • ref:ref定義的數(shù)據(jù)需要通過(guò).value進(jìn)行操作,模板讀取數(shù)據(jù)時(shí)不需要使用.value
  • reactive:reactive定義的數(shù)據(jù)無(wú)需.value,即可進(jìn)行設(shè)置和讀取

六、計(jì)算屬性和監(jiān)視

與vue2中的computed配置功能一致

寫(xiě)法:

  1. import {computed} from "vue"
  2. setup(){ 
  3.   const sum = computed(()=>{ 
  4.     return num1 + num2; 
  5.   }) 
  1. import {computed,reactive} from "vue" 
  2. setup(){ 
  3.   const person = reactive({ 
  4.     firstName:"wen"
  5.     lastName:"bo" 
  6.   }) 
  7.   //簡(jiǎn)寫(xiě) 
  8.   let fullName = computed(()=>{ 
  9.     return person.firstName + "-" + person.lastName; 
  10.   }); 
  11.    
  12.   //完整 
  13.   let fullName = computed(()=>{ 
  14.     get(){ 
  15.       return person.firstName + "-" + person.lastName; 
  16.     }, 
  17.     set(value){ 
  18.       const newArr = value.split("-"); 
  19.       person.firstName = nameArr[0]; 
  20.       person.lastName = nameArr[1]; 
  21.     } 
  22.   }) 

七、watch函數(shù)

與vue2中的watch配置功能一致

注意:

  • 監(jiān)視r(shí)eactive定義的響應(yīng)式數(shù)據(jù)時(shí),oldValue無(wú)法正確獲取,強(qiáng)制開(kāi)啟了深度監(jiān)視(deep配置失敗)
  • 監(jiān)視r(shí)eactive定義的響應(yīng)式數(shù)據(jù)中某個(gè)屬性時(shí),deep配置有效
  1. let person = reactive({ 
  2.   name:"wenbo"
  3.   age:18, 
  4.   job:{ 
  5.     job1:{ 
  6.       salary:20 
  7.     } 
  8.   } 
  9. }) 
  10.  
  11. // 情況一:監(jiān)視r(shí)ef定義的響應(yīng)式數(shù)據(jù) 
  12. watch(sum,(newValue,oldValue)=>{ 
  13.   console.log("sum變了",newValue,oldValue); 
  14. },{immediate:true}) 
  15.  
  16. // 情況二:監(jiān)視多個(gè)ref定義的響應(yīng)式數(shù)據(jù) 
  17. watch([sum,msg],(newValue,oldValue)=>{ 
  18.   console.log("sum或msg變了",newValue,oldValue); 
  19. }) 
  20.  
  21. /*情況三:監(jiān)視r(shí)eactive定義的響應(yīng)式數(shù)據(jù) 
  22.   若watch監(jiān)視的是reactive定義的響應(yīng)式數(shù)據(jù),則無(wú)法正確獲得oldValue 
  23.   若watch監(jiān)視的是reactive定義的響應(yīng)式數(shù)據(jù),則強(qiáng)制開(kāi)啟了深度監(jiān)視 
  24.   此時(shí)的deep不生效 
  25. */ 
  26. watch(person,(newValue,oldValue)=>{ 
  27.   console.log("perosn變了",newValue,oldValue); 
  28. },{immediate:true,deep:false}) 
  29.  
  30. //情況四:監(jiān)視r(shí)eactive所定義的一個(gè)響應(yīng)式數(shù)據(jù)中的某個(gè)屬性 
  31. watch(()=>person.age,(newValue,oldValue)=>{ 
  32.   console.log("person的age變化了",newValue,oldValue) 
  33. }) 
  34.  
  35. //情況五:監(jiān)視r(shí)eactive所定義的一個(gè)響應(yīng)式數(shù)據(jù)中的某些屬性 
  36. watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{ 
  37.   console.log("person的name或age變化了",newValue,oldValue) 
  38. }) 
  39.  
  40. //特殊情況-監(jiān)聽(tīng)的對(duì)象的屬性還是個(gè)對(duì)象,此時(shí)deep生效,可以進(jìn)行深度監(jiān)聽(tīng) 
  41. watch(()=>person.job,(newValue,oldValue)=>{ 
  42.   console.log("person的job變化了",newValue,oldValue) 
  43. },{deep:true}) 

注意:

watch監(jiān)聽(tīng)reactive定義的對(duì)象有五種情況

watch監(jiān)聽(tīng)ref定義的響應(yīng)式數(shù)據(jù)有兩種情況:

  • ref定義的是基本類(lèi)型數(shù)據(jù),此時(shí)不能對(duì).value進(jìn)行監(jiān)聽(tīng)。如const num = ref(0),此時(shí)對(duì)num.value監(jiān)聽(tīng)的話相當(dāng)于直接對(duì)num的值(0)進(jìn)行監(jiān)聽(tīng)了,想想0有啥變化的。
  • ref定義的是對(duì)象數(shù)據(jù)類(lèi)型,此時(shí)ref處理后的數(shù)據(jù)是ref實(shí)例的。要監(jiān)聽(tīng)對(duì)象的變化,需要對(duì)對(duì)象的.value進(jìn)行監(jiān)聽(tīng),因?yàn)閞ef對(duì)象.value是借助reactive處理的響應(yīng)式數(shù)據(jù)proxy。

八、watchEffect函數(shù)

watch的套路:既要指明監(jiān)視的屬性,又要指明監(jiān)視的回調(diào)

watchEffect的套路:不用指明監(jiān)視的哪個(gè)屬性,監(jiān)視的回調(diào)中用到哪個(gè)屬性,就監(jiān)視哪個(gè)屬性

watchEffect有點(diǎn)類(lèi)似computed:

  • computed注重的是計(jì)算的值,即回調(diào)函數(shù)的返回值,所以必須要寫(xiě)返回值
  • watchEffect注重的是計(jì)算的過(guò)程,即回調(diào)函數(shù)的函數(shù)題,所以不用寫(xiě)返回值
  1. let person = reactive({ 
  2.   name:"wenbo"
  3.   age:18, 
  4.   job:{ 
  5.     job1:{ 
  6.       salary:20 
  7.     } 
  8.   } 
  9. }) 
  10.  
  11. // warchEffect所指定的回調(diào)中用到的數(shù)據(jù)只要發(fā)生變化,則直接重新執(zhí)行回調(diào) 
  12. watchEffect(()=>{ 
  13.   const x = person.name 
  14.   const y = person.job.job1.salary 
  15.   console.log("watchEffect觸發(fā)了"
  16. }) 

九、自定義hooks函數(shù)

  • hook函數(shù):本質(zhì)上是一個(gè)函數(shù),把setup函數(shù)中是用的組合api進(jìn)行封裝
  • 類(lèi)似于vue2中mixins
  • 優(yōu)點(diǎn):復(fù)用代碼、使得setup中的邏輯更清晰易懂
  1. <div>pageX:{{point.pageX}},pageY:{{point.pageY}}<div> 

hooks文件 usePoint.js

  1. import {reactive} from "vue" 
  2.  
  3. const handleClickPoint = ()=>{ 
  4.   //實(shí)現(xiàn)鼠標(biāo)“打點(diǎn)”相關(guān)數(shù)據(jù) 
  5.   let point = reactive({ 
  6.     pageX:0, 
  7.     pagey:0 
  8.   }) 
  9.    
  10.   //實(shí)現(xiàn)鼠標(biāo)“打點(diǎn)”相關(guān)方法 
  11.   const handlePoint = (event)=>{ 
  12.     point.pageX = event.pageX; 
  13.     point.pageY = event.pageY; 
  14.     console.log(event.pageX,event.pageY) 
  15.   } 
  16.   //實(shí)現(xiàn)鼠標(biāo)打點(diǎn)的相關(guān)周期函數(shù) 
  17.   onMounted(()=>{ 
  18.     window.addEventListener("click",handlePoint) 
  19.   }) 
  20.    
  21.   onBeforeUnmounted(()=>{ 
  22.     window.removeEventListener("click",handlePoint) 
  23.   }) 

十、toRef函數(shù)

  • 經(jīng)過(guò)ref、reactive處理的對(duì)象不能直接使用解構(gòu)進(jìn)行處理,否則就會(huì)失去響應(yīng)式特性
  • 作用:創(chuàng)建一個(gè)ref對(duì)象,其value值指向另一個(gè)對(duì)象中的某個(gè)屬性
  • 語(yǔ)法:const name = toRef(person,"name")
  • 應(yīng)用:要將響應(yīng)式對(duì)象中的某個(gè)屬性單獨(dú)提供給外部使用時(shí)
  • 擴(kuò)展:toRefs與toRef功能一致,但是可以批量創(chuàng)建多個(gè)ref對(duì)象,語(yǔ)法:toRefs(person)

十一、VUE3生命周期

圖片
圖片

其它組合式api

1. shallowReactive與shallowRef

shallowReactive:只處理對(duì)象最外層屬性的響應(yīng)式(淺響應(yīng)式)

shallowRef:只處理基本數(shù)據(jù)類(lèi)型的響應(yīng)式,不進(jìn)行對(duì)象的響應(yīng)式處理

使用時(shí)機(jī):

  • 如果有一個(gè)對(duì)象數(shù)據(jù),結(jié)構(gòu)比較深,但變化時(shí)只是外層屬性變化==》shallowReactive
  • 如果有一個(gè)對(duì)象數(shù)據(jù),后續(xù)功能不會(huì)修改該對(duì)象中的屬性,而是生成新的對(duì)象來(lái)替換==》shallowRef

2. readonly與shallowReadonly

  • readonly:讓一個(gè)響應(yīng)式數(shù)據(jù)變?yōu)橹蛔x數(shù)據(jù)(深只讀)
  • shallowReadonly:讓一個(gè)響應(yīng)式數(shù)據(jù)變?yōu)橹蛔x(淺只讀)
  • 應(yīng)用場(chǎng)景:不希望數(shù)據(jù)被修改時(shí)

3. toRaw與markRaw

toRaw

  • 作用:將一個(gè)由reactive生成的響應(yīng)式對(duì)象轉(zhuǎn)為普通對(duì)象
  • 使用場(chǎng)景:用于讀取響應(yīng)式對(duì)象對(duì)應(yīng)的普通對(duì)象,對(duì)這個(gè)普通對(duì)象的所有操作,不會(huì)引起頁(yè)面的更新

markRaw

  • 有些值不應(yīng)該被設(shè)置為響應(yīng)式的,例如:復(fù)雜的第三方庫(kù)
  • 當(dāng)渲染具有不可變數(shù)據(jù)源的大列表時(shí),跳過(guò)響應(yīng)式轉(zhuǎn)換可以提高性能
  • 作用:標(biāo)記一個(gè)對(duì)象,使其永遠(yuǎn)不會(huì)稱(chēng)為響應(yīng)式對(duì)象
  • 應(yīng)用場(chǎng)景:

4. customRef

作用:創(chuàng)建一個(gè)自定義ref,并對(duì)其依賴(lài)項(xiàng)跟蹤和更新觸發(fā)進(jìn)行顯式控制

示例:

  1. <template> 
  2.   <input type="text" v-model="str"/> 
  3.   <h1>當(dāng)前的值:{{str}}</h1> 
  4. </template> 
  5.  
  6.   <script> 
  7.   import {ref, customRef} from "vue"
  8.   export default { 
  9.     setup(){ 
  10.       // 自定義一個(gè)ref:myRef 
  11.       const myRef = (value)=>{ 
  12.         return customRef((track,trigger)=>{ 
  13.           return
  14.             get(){ 
  15.               console.log(`有人從myRef中讀取了此數(shù)據(jù)${value}`); 
  16.               track(); 
  17.               return value; 
  18.             }, 
  19.             set(newValue){ 
  20.               console.log(`有人把myRef的數(shù)據(jù)改為了新數(shù)據(jù)${newValue}`); 
  21.               value = newValue; 
  22.               trigger();//通知vue去重新解析模板 
  23.             } 
  24.           } 
  25.         }); 
  26.       } 
  27.       const str = myRef("hello"); 
  28.       return
  29.         str 
  30.       } 
  31.     } 
  32.   } 
  33.   </script> 

5. provide與inject

  •  作用:實(shí)現(xiàn)祖孫組件間的通信
  • 應(yīng)用場(chǎng)景:父組件有一個(gè)provide選項(xiàng)提供數(shù)據(jù),子組件有一個(gè)inject來(lái)獲取使用數(shù)據(jù)

6. 響應(yīng)式數(shù)據(jù)的判斷

  •  isRef:檢查一個(gè)值是否為ref對(duì)象
  •  isReactive:檢查一個(gè)值是否為reactive創(chuàng)建的響應(yīng)式代理
  •  isReadonly:檢查一個(gè)對(duì)象是否是由readonly創(chuàng)建的只讀代理
  •  isProxy:檢查一個(gè)對(duì)象是否是由reactive或readonly創(chuàng)建的代理

vue3中使用hook注意點(diǎn)

hook中存在異步問(wèn)題

其實(shí)在使用中可以發(fā)現(xiàn),其實(shí)hook本質(zhì)上就是進(jìn)行抽取的函數(shù),靈活性比較高,但是在涉及到異步邏輯時(shí)考慮不周全就會(huì)導(dǎo)致很多問(wèn)題。hook是可以覆蓋異步情況的,但是必HTML須在setup當(dāng)中執(zhí)行時(shí)返回有效對(duì)象不能被阻塞。

通常異步具有兩種風(fēng)格:

外部沒(méi)有其它依賴(lài),只是交付渲染的響應(yīng)變量。對(duì)于此種情況,可以通過(guò)聲明、對(duì)外暴露響應(yīng)變量,在hook中使用異步修改的方式。

外部具有依賴(lài),需要在使用側(cè)進(jìn)行加工。對(duì)于此種情形,可以通過(guò)對(duì)外暴露Promise的方式,使得外部獲取到同步操作的能力。

this的問(wèn)題

由于setup處于生命周期的beforeCreate和created階段之間,因此不能獲取到this。當(dāng)然我們可以通過(guò)setup的第二個(gè)參數(shù)context獲取到類(lèi)似與this的部分能力,但是對(duì)于想操作路由、vuex等能力則受到了限制,為此最新的router@4、vuex@4都提供了組合式的api。

由于vue2底層限制使得無(wú)法使用這些hook,為此可以通過(guò)引用實(shí)例的方式獲取一定的操作能力,也可以通過(guò)getCurrentInstance獲得組件實(shí)例上掛載的對(duì)象。

雖然組合式api的響應(yīng)式原理是通過(guò)Object.defineProperty改寫(xiě)屬性的,與vue的響應(yīng)式原理相同,但是在具體實(shí)現(xiàn)方式上存在差異,因此在setup中與vue原生的響應(yīng)式并不互通。正因此,導(dǎo)致即使拿到相應(yīng)的實(shí)例也沒(méi)有辦法監(jiān)聽(tīng)它們的響應(yīng)式,只能通過(guò)在選項(xiàng)配置進(jìn)行使用。

vue3中常見(jiàn)的組件

1. Fragment組件

在vue2中:組件必須有一個(gè)根標(biāo)簽

在vue3中:組件可以沒(méi)有根標(biāo)簽,內(nèi)部會(huì)將多個(gè)標(biāo)簽包裹在Fragment虛擬元素中

好處:減少標(biāo)簽層級(jí),減少內(nèi)存占用

2. Teleport

Teleport時(shí)倚重能夠?qū)⒔M件html結(jié)構(gòu)移動(dòng)到指定位置的技術(shù)

語(yǔ)法:

main.vue

  1. <div name="modal"></div> 
  2. <Modal :isOpen="isOpen" @closeModal="closeModal"/> 
  3. <button @click="openModal" >open modal</button> 

modal.vue

  1. <teleport to='#modal'
  2.    <div class="modal-box" v-if="isOpen"
  3.      <slot>this is a modal</slot> 
  4.      <button @click="handleCloseModal">close</button> 
  5.    </div> 
  6.  </teleport> 

3. suspense

等待異步組件時(shí)渲染一些額外內(nèi)容,讓?xiě)?yīng)用有更好的用戶體驗(yàn)。

使用步驟:

  • 異步引入組件
  • 使用suspense包裹組件,并配置好default與fallback。
  1. import {defineAsyncComponent} from "vue" 
  2. const child =defineAsyncComponent(()=>import("./components/child.vue")) 

【編輯推薦】

 

責(zé)任編輯:姜華 來(lái)源: 前端萬(wàn)有引力
相關(guān)推薦

2024-04-26 00:25:52

Rust語(yǔ)法生命周期

2021-08-05 06:54:05

流程控制default

2024-02-27 10:11:36

前端CSS@規(guī)則

2020-09-19 21:15:26

Composition

2021-10-11 07:55:42

瀏覽器語(yǔ)法Webpack

2013-08-02 10:52:10

Android UI控件

2024-04-07 08:41:34

2024-08-26 10:01:50

2024-06-12 00:00:05

2010-08-25 01:59:00

2011-12-02 09:22:23

網(wǎng)絡(luò)管理NetQos

2013-10-16 14:18:02

工具圖像處理

2023-04-06 09:08:41

BPM流程引擎

2021-10-29 09:32:33

springboot 靜態(tài)變量項(xiàng)目

2019-07-24 15:30:00

SQL注入數(shù)據(jù)庫(kù)

2020-02-21 08:45:45

PythonWeb開(kāi)發(fā)框架

2021-05-20 11:17:49

加密貨幣區(qū)塊鏈印度

2023-09-06 18:37:45

CSS選擇器符號(hào)

2020-10-19 06:43:53

Redis腳本原子

2023-04-03 08:30:54

項(xiàng)目源碼操作流程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)