国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從Vue2到Vue3【三】——Composition API(第三章)

這篇具有很好參考價(jià)值的文章主要介紹了從Vue2到Vue3【三】——Composition API(第三章)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

系列文章目錄

內(nèi)容 鏈接
從Vue2到Vue3【零】 Vue3簡(jiǎn)介
從Vue2到Vue3【一】 Composition API(第一章)
從Vue2到Vue3【二】 Composition API(第二章)
從Vue2到Vue3【三】 Composition API(第三章)
從Vue2到Vue3【四】 Composition API(第四章)


前言

隨著Vue 3的發(fā)布,我們迎來(lái)了一套強(qiáng)大且令人興奮的組合式API,這為開(kāi)發(fā)者帶來(lái)了更多靈活性和可維護(hù)性。Vue 3的組合式API不僅改變了我們編寫(xiě)Vue組件的方式,還引入了一些新的組件和一些小的但實(shí)用的改變。在這篇文章中,我們將深入探討Vue 3的組合式API,并介紹一些引人注目的新組件和改變,讓我們一起開(kāi)始這個(gè)令人興奮的學(xué)習(xí)之旅吧!

一、shallowReactive 與 shallowRef

  • shallowReactive:

    • shallowReactive函數(shù)用于創(chuàng)建一個(gè)淺響應(yīng)式對(duì)象,它只會(huì)對(duì)對(duì)象的第一層屬性進(jìn)行響應(yīng)式處理,而不會(huì)遞歸地對(duì)嵌套的屬性進(jìn)行深層次響應(yīng)式處理。
    • 這在某些情況下可以提高性能和減少內(nèi)存消耗,特別是當(dāng)對(duì)象的嵌套層次很深或者對(duì)象非常大時(shí)。
    • 適用場(chǎng)景:當(dāng)需要對(duì)一個(gè)大型對(duì)象進(jìn)行響應(yīng)式處理,但只關(guān)心對(duì)象的第一層屬性變化時(shí),可以使用shallowReactive來(lái)避免深層次的響應(yīng)式處理。
import {shallowReactive} from 'vue'
export default {
	name: 'App',
	setup(){
		let data = ({
		name: 'John',
		age: 25,
		address: {
			street: 'Main St',
			city: 'New York'
			}
		})
		let data1 = shallowReactive(data)
		return {
				data1
		}
	}
}

由于shallowReactive函數(shù)創(chuàng)建的是一個(gè)淺響應(yīng)式對(duì)象,所以當(dāng)改變data1.name時(shí),會(huì)觸發(fā)響應(yīng)
但當(dāng)修改data1.address.street時(shí),就不會(huì)觸發(fā)響應(yīng) (shallowReactive:只處理對(duì)象最外層屬性的響應(yīng)式)

  • shallowRef:

    • shallowRef函數(shù)用于創(chuàng)建一個(gè)淺響應(yīng)式引用,它只會(huì)對(duì)值的第一層進(jìn)行響應(yīng)式處理,而不會(huì)遞歸地對(duì)嵌套的值進(jìn)行深層次響應(yīng)式處理 ===》只處理基本數(shù)據(jù)類型的響應(yīng)式, 不進(jìn)行對(duì)象的響應(yīng)式處理
    • 類似于shallowReactive,這在某些情況下可以提高性能和減少內(nèi)存消耗。
    • 適用場(chǎng)景:當(dāng)需要對(duì)一個(gè)值進(jìn)行響應(yīng)式處理,但只關(guān)心值的第一層變化時(shí),可以使用shallowRef來(lái)避免深層次的響應(yīng)式處理。
<template>
	{{name1}} 
	<button @click="name1 = '前端百草閣'">點(diǎn)我修改name</button>
	<br>
	{{ data1.address.street }}
	<button @click="data1.address.street = '前端百草閣'">點(diǎn)我修改stree</button>
</template>

<script>
import {shallowRef} from 'vue'
export default {
	name: 'App',
	setup(){
		let name = 'John'
		let data = ({
		age: 25,
		address: {
			street: 'Main St',
			city: 'New York'
			}
		})
		let data1 = shallowRef(data)
		let name1 = shallowRef(name)

		console.log(data1.value,name1.value);  // 在setup中操作數(shù)據(jù)時(shí) 要加.value
		return {
			data1,
			name1
		}
	}
}
</script>

從Vue2到Vue3【三】——Composition API(第三章),從Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API
這里小伙伴們注意一個(gè)點(diǎn),無(wú)論是操作數(shù)據(jù)還是使用數(shù)據(jù)都和ref、reactive一樣,ref在操作數(shù)據(jù)時(shí)要加.value才能拿到對(duì)應(yīng)的值

通過(guò)使用shallowReactive和shallowRef,可以根據(jù)具體的需求選擇性地進(jìn)行響應(yīng)式處理,避免不必要的性能開(kāi)銷。在處理大型對(duì)象或嵌套層次較深的數(shù)據(jù)時(shí),這些函數(shù)可以提供更好的性能和內(nèi)存利用率。

二、readonly 與 shallowReadonly

  • readonly
    • 讓一個(gè)響應(yīng)式數(shù)據(jù)變?yōu)橹蛔x的(深只讀
    • 將整個(gè)對(duì)象及其嵌套的屬性設(shè)置為只讀的場(chǎng)景,保護(hù)某些數(shù)據(jù)不被修改
<script>
import { ref, reactive, toRefs,readonly } from "vue";
export default {
  name: "deMO",
  setup() {
    //數(shù)據(jù)
    let sum = ref(0);
    let person = reactive({
      name: "張三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });

    person = readonly(person);
    sum = readonly(sum)

    return {
      sum,
      ...toRefs(person),
    };
  },
};
</script>

由于這里使用的是readonly深只讀,所以sum以及person的每一個(gè)屬性都無(wú)法被修改

  • shallowReadonly
    • 讓一個(gè)響應(yīng)式數(shù)據(jù)變?yōu)橹蛔x的(淺只讀
    • 將對(duì)象數(shù)據(jù)的第一層屬性設(shè)置為只讀
<script>
import { ref, reactive, toRefs,shallowReadonly } from "vue";
export default {
  name: "deMO",
  setup() {
    //數(shù)據(jù)
    let sum = ref(0);
    let person = reactive({
      name: "張三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });
    
    person = shallowReadonly(person)
    sum = shallowReadonly(sum)
    
    return {
      sum,
      ...toRefs(person),
    };
  },
};
</script>

由于person設(shè)置了淺只讀,所以person中的name屬性值不能改變,但是person中的j1里的屬性是可以修改的

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

通過(guò)使用readonly和shallowReadonly,我們可以根據(jù)具體的需求選擇性地進(jìn)行保護(hù)數(shù)據(jù)的可寫(xiě)性,從而提高代碼的可靠性和安全性。

這里注意無(wú)論是深只讀還是淺只讀都不會(huì)影響到原先的響應(yīng)式數(shù)據(jù),所以最好用方法返回的只讀數(shù)據(jù)覆蓋掉之前的響應(yīng)式數(shù)據(jù) ,更加安全
什么意思呢? 在進(jìn)行只讀操作后,原先的響應(yīng)式數(shù)據(jù)并不會(huì)發(fā)生變化,并且當(dāng)你再次修改這個(gè)響應(yīng)式數(shù)據(jù)時(shí),只讀的數(shù)據(jù)會(huì)跟著變化

舉個(gè)例子,大家注意看

  setup() {
    let car = reactive({ name: "奔馳", price: "40W" });
    let car1 = readonly(car)
    car.name = '寶馬'
    // car1.name = '勞斯萊斯'   car1的值為只讀不能修改 
    console.log(car1,car);
    
    return { };
  },
};

這里car1是car的只讀數(shù)據(jù),當(dāng)car的值發(fā)生變化時(shí),car1的值對(duì)應(yīng)著也會(huì)變化,但是car1的值不能直接修改
從Vue2到Vue3【三】——Composition API(第三章),從Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API
car1 的值直接修改不起作用,并且會(huì)報(bào)錯(cuò)
從Vue2到Vue3【三】——Composition API(第三章),從Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API

三、toRaw 與 markRaw

  • toRaw函數(shù):

    • 作用:將一個(gè)由reactive生成的響應(yīng)式對(duì)象轉(zhuǎn)為普通對(duì)象
    • 使用場(chǎng)景:用于讀取響應(yīng)式對(duì)象對(duì)應(yīng)的普通對(duì)象,對(duì)這個(gè)普通對(duì)象的所有操作,不會(huì)引起頁(yè)面更新。
<script>
	import {ref,reactive,toRaw} from 'vue'
	export default {
		name: 'Demo',
		setup(){
			//數(shù)據(jù)
			let person1 = ref({
				name:'張三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})
			let person = reactive({
				name:'張三',
				age:18,
				job:{
					j1:{
						salary:20
					}
				}
			})

				const p = toRaw(person) // person是reactive生成的響應(yīng)式對(duì)象
				p.age++      // 普通對(duì)象的值可以改變 但是不再引起頁(yè)面更新
				console.log(p)  // 轉(zhuǎn)換完后的p就是一個(gè)普通對(duì)象

				const p1 = toRaw(person1.value) 
				p1.age++      
				console.log(p)  // 轉(zhuǎn)換完后的p就是一個(gè)普通對(duì)象
			
			return {
				sum,
				person
			}
		}
	}
</script>

這里注意筆者為什么要寫(xiě)兩個(gè)person,不是說(shuō)toRaw的作用是把一個(gè)由reactive生成的響應(yīng)式對(duì)象轉(zhuǎn)換為一個(gè)普通對(duì)象么?
為什么這里還有一個(gè)由ref生成的響應(yīng)式對(duì)象呢

這得透過(guò)問(wèn)題看本質(zhì),ref定義一個(gè)響應(yīng)式對(duì)象內(nèi)部求助了reactive,所以person1.value實(shí)質(zhì)上也是一個(gè)Proxy對(duì)象,所以在轉(zhuǎn)換成普通對(duì)象時(shí),要toRaw(person1.value)

再注意一個(gè)問(wèn)題,大家有沒(méi)有一個(gè)疑問(wèn),我把person轉(zhuǎn)成了普通對(duì)象并且用一個(gè)p接收轉(zhuǎn)換完后的對(duì)象,那么person自己本身有變化么

實(shí)驗(yàn)才能出真知,由于好奇大家才在不停的進(jìn)步,嘗試后發(fā)現(xiàn)響應(yīng)式對(duì)象轉(zhuǎn)換為普通對(duì)象時(shí),并不會(huì)影響先前的響應(yīng)式對(duì)象,換句話說(shuō)就是person依然是響應(yīng)式對(duì)象,修改它,頁(yè)面依舊會(huì)發(fā)生變化
還有一個(gè)點(diǎn)

  setup() {
    let car = reactive({ name: "奔馳", price: "40W" });
    let car2 = toRaw(car)
    // car.name = '寶馬'
    car2.name = '勞斯萊斯' 
    console.log(car,car2);
    }

從Vue2到Vue3【三】——Composition API(第三章),從Vue2到Vue3,vue.js,javascript,前端,vue3,Composition API

修改car 會(huì)改變car的值,修改car2的值同時(shí)car的值也會(huì)變

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

      響應(yīng)式追蹤和更新是一個(gè)相對(duì)開(kāi)銷較大的操作。將復(fù)雜的第三方類庫(kù)或大型對(duì)象設(shè)置為響應(yīng)式的,會(huì)導(dǎo)致每次更新時(shí)都需要深度遍歷對(duì)象并觸發(fā)更新,對(duì)性能有一定影響。如果這些值不需要在視圖中展示或參與響應(yīng)式計(jì)算,將其設(shè)置為非響應(yīng)式可以提高性能。

<script>
<script>
import { ref, reactive, toRefs, markRaw } from "vue";
export default {
  name: "deMo",
  setup() {
    let person = reactive({
      name: "張三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });

      let car = { name: "奔馳", price: 40 };
      person.car = markRaw(car);  // 將一個(gè)標(biāo)記過(guò)的對(duì)象添加到person的屬性中

      person.car.price++;  // 數(shù)據(jù)會(huì)變化  但是頁(yè)面不再更新(沒(méi)有響應(yīng)式)
      console.log(person.car.price);

    return {
      person,
      ...toRefs(person), // 普通對(duì)象被標(biāo)記過(guò)后 再也無(wú)法變成響應(yīng)式的
    };
  },
};
</script>

這里注意一個(gè)點(diǎn) 如果說(shuō)person已經(jīng)是一個(gè)響應(yīng)式對(duì)象了,這時(shí)及時(shí)往他身上添加一個(gè)普通的屬性,這個(gè)屬性也具有響應(yīng)式

      let car = { name: "奔馳", price: 40 };
      person.car = car;  // 將一個(gè)普通對(duì)象添加到person的屬性中

      person.car.price++;  // 數(shù)據(jù)會(huì)變化  頁(yè)面會(huì)更新(有響應(yīng)式)
      console.log(person.car.price);

通過(guò)使用toRaw和markRaw,我們可以有更靈活的控制對(duì)象的響應(yīng)式特性。toRaw使我們能夠獲取響應(yīng)式對(duì)象的非響應(yīng)式原始值。markRaw則可以將對(duì)象標(biāo)記為非響應(yīng)式,避免不必要的響應(yīng)式追蹤和更新。這些工具在一些特定場(chǎng)景下提供了更好的性能和控制的選擇。

總結(jié)

本文講解了vue3組合式API中的 shallowReactive 與 shallowRefreadonly 與 shallowReadonly、toRaw 與 markRaw的用法以及注意事項(xiàng),歡迎大家訂閱本系列文章,干貨滿滿!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-601715.html

到了這里,關(guān)于從Vue2到Vue3【三】——Composition API(第三章)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Vue3.0 所采用的 Composition Api 與 Vue2.x 使用的 Options Api 有什么不同?

    Composition API 可以說(shuō)是Vue3的最大特點(diǎn),那么為什么要推出Composition Api,解決了什么問(wèn)題? 通常使用Vue2開(kāi)發(fā)的項(xiàng)目,普遍會(huì)存在以下問(wèn)題: 1、代碼的可讀性隨著組件變大而變差 2、每一種代碼復(fù)用的方式,都存在缺點(diǎn) 3、TypeScript支持有限 一、Options Api Options API,即大家常說(shuō)的

    2024年02月12日
    瀏覽(31)
  • 【vue3】11-Vue 3中的Composition Api(一)

    【vue3】11-Vue 3中的Composition Api(一)

    在Vue2中,我們編寫(xiě)組件的方式是Options APl: Options API的一大特點(diǎn)就是在 對(duì)應(yīng)的屬性 中編寫(xiě) 對(duì)應(yīng)的功能模塊 ; 比如 data定義數(shù)據(jù) 、 methods中定義方法 、 computed中定義計(jì)算屬性 、 watch中監(jiān)聽(tīng)屬性改變 ,也包括 生命周期鉤子 ; 但是這種代碼有一個(gè)很大的弊端: 當(dāng)我們 實(shí)現(xiàn)某一個(gè)功

    2024年02月08日
    瀏覽(19)
  • 探究Vue3中的Composition API:優(yōu)化組件邏輯的新利器

    探究Vue3中的Composition API:優(yōu)化組件邏輯的新利器

    在 Vue 3.0 中,引入了一種新的響應(yīng)式 API,即 toRef 。 toRef 函數(shù)可以將一個(gè)普通值轉(zhuǎn)換為響應(yīng)式引用類型,這樣就可以在模板中直接使用這個(gè)響應(yīng)式引用類型的屬性,并且當(dāng)該屬性發(fā)生變化時(shí),視圖會(huì)自動(dòng)更新。 通過(guò)控制臺(tái)打印輸出的內(nèi)容和頁(yè)面的變化,我們可以觀察到,age的

    2024年02月10日
    瀏覽(24)
  • Composition API 的優(yōu)勢(shì)、新的組件(Fragment,Teleport,Suspense)【Vue3】

    Composition API 的優(yōu)勢(shì)、新的組件(Fragment,Teleport,Suspense)【Vue3】

    使用傳統(tǒng)OptionsAPI中,新增或者修改一個(gè)需求,就需要分別在data,methods,computed里修改。 我們可以更加優(yōu)雅的組織我們的代碼,函數(shù)。讓相關(guān)功能的代碼更加有序的組織在一起。 在Vue2中:組件必須有一個(gè)根標(biāo)簽 在Vue3中:組件可以沒(méi)有根標(biāo)簽,內(nèi)部會(huì)將多個(gè)標(biāo)簽包含在一個(gè)

    2024年02月02日
    瀏覽(24)
  • (Java高級(jí)教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例

    (Java高級(jí)教程)第三章Java網(wǎng)絡(luò)編程-第七節(jié)2:Servlet API和綜合案例

    前面說(shuō)過(guò),Servlet就是Tomcat這個(gè)HTTP服務(wù)器提供給Java的一組API,來(lái)完成構(gòu)建動(dòng)態(tài)頁(yè)面等任務(wù)。Servlet中涉及的API非常多,這里我們只關(guān)注以下三個(gè)即可,其余的可在工作中獲得遇到具體場(chǎng)景再學(xué)習(xí)使用 HttpServlet HttpServletRequest HttpServletResponse HttpServlet :它提供了處理基于HTTP協(xié)議的

    2024年02月09日
    瀏覽(25)
  • vue3前端開(kāi)發(fā),感受一下組合式api和VUE2選項(xiàng)式的差異

    vue3前端開(kāi)發(fā),感受一下組合式api和VUE2選項(xiàng)式的差異

    vue3前端開(kāi)發(fā),感受一下組合式api和VUE2選項(xiàng)式的差異!今天開(kāi)始,正式開(kāi)始,進(jìn)入學(xué)習(xí)Vue3的內(nèi)容。以后代碼,案例分享,都會(huì)采用組合式api的模式為大家做展示。 今天是第一節(jié),帶大家感受一下,Vue3的組合式api和之前傳統(tǒng)的vue2版本選項(xiàng)式api的差別。 首先,大家需要提前使用

    2024年01月19日
    瀏覽(32)
  • Vue 3 Composition API 詳解

    在Vue 3中,引入了一個(gè)新的Composition API,旨在提供一種更靈活和可重用的方式來(lái)組織組件代碼。Composition API基于函數(shù)式編程思想,允許開(kāi)發(fā)者將邏輯和狀態(tài)管理邏輯分離,使代碼更加清晰和可維護(hù)。 響應(yīng)式數(shù)據(jù) 在Vue 3中,響應(yīng)式數(shù)據(jù)是組件狀態(tài)的重要組成部分。通過(guò)使用 re

    2024年01月21日
    瀏覽(23)
  • 詳解Vue 3 的 Composition API

    詳解Vue 3 的 Composition API

    Vue 3 的 Composition API 是一種新的組合式 API 風(fēng)格,它可以更好地組織和復(fù)用組件邏輯。相比于 Vue 2 的 Options API,Composition API 提供了更靈活和可組合的方式來(lái)編寫(xiě)組件。 下面是 Composition API 的一些特點(diǎn)和優(yōu)勢(shì): 函數(shù)式組件:Composition API 支持使用函數(shù)式組件的方式來(lái)編寫(xiě)組件。

    2024年02月10日
    瀏覽(17)
  • vue/composition-api 的使用

    最近我們項(xiàng)目是 vue2,但是要使用?jsx + composition ,所以來(lái)學(xué)習(xí)一下這個(gè)?vue/composition-api (一)安裝 (二)注冊(cè) 在 main.ts 中 (三)使用 最基本的組件: defineComponent 本身的功能很簡(jiǎn)單,但是最主要的功能是為了 ts 下的類型推導(dǎo)~ 1. setup 函數(shù) setup 在 create 實(shí)例在初始化之前調(diào)

    2024年02月05日
    瀏覽(27)
  • Vue Composition API之偵聽(tīng)器watch/watchEffect

    Vue Composition API之偵聽(tīng)器watch/watchEffect

    在日常的開(kāi)發(fā)中,很多時(shí)候我們需要去對(duì)一些狀態(tài)進(jìn)行監(jiān)聽(tīng),比如當(dāng)顯示學(xué)生的成績(jī)列表時(shí),我們使用一個(gè)學(xué)生的學(xué)號(hào)student_num作為請(qǐng)求成績(jī)的參數(shù),如果沒(méi)有監(jiān)聽(tīng)機(jī)制,當(dāng)學(xué)號(hào)student_num改變時(shí),我們需要依賴用戶的操作去刷新成績(jī)。但是有了偵聽(tīng)器,我們可以通過(guò)偵聽(tīng)器去監(jiān)

    2024年02月08日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包