国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Vue3又出新語(yǔ)法 到底何時(shí)才能折騰完?

開發(fā) 前端
大家應(yīng)該知道如果用 Vue3 的 Composition API 定義一個(gè)響應(yīng)式變量通常有兩種形式,一種是用ref,另一種是reactive。

前言

大家應(yīng)該知道如果用 Vue3 的 Composition API 定義一個(gè)響應(yīng)式變量通常有兩種形式,一種是用ref,另一種是reactive:

  1. <script setup> 
  2. import { ref, reactive } from 'vue' 
  3.  
  4. const isLoading = ref(true
  5.  
  6. const user = reactive({ 
  7.   name'令狐沖'
  8.   age: 22, 
  9.   gender: '男' 
  10. }) 
  11. </script> 

 

一般來(lái)說(shuō)定義一個(gè)基本數(shù)據(jù)類型會(huì)用ref,而引用類型則會(huì)采用reactive,那么問(wèn)題來(lái)了,ref雖然定義了一個(gè)基本數(shù)據(jù)類型,但實(shí)際上它卻是一個(gè)引用類型,取值和賦值時(shí)必須要帶上.value屬性:

  1. <script setup> 
  2. import { ref } from 'vue' 
  3.  
  4. const isLoading = ref(true
  5.  
  6. if (isLoading.value) { 
  7.   isLoading.value = false 
  8. </script> 

 

這就有點(diǎn)不太符合直覺了,很有可能一不小心就被寫成了這樣:

  1. <script setup> 
  2. import { ref } from 'vue' 
  3.  
  4. let isLoading = ref(true
  5.  
  6. if (isLoading) { 
  7.   isLoading = false 
  8. </script> 

 

這要是有TS和ESLint的加持還好,要是沒有的話可就不好找錯(cuò)誤了,也不會(huì)產(chǎn)生什么有用的報(bào)錯(cuò)信息,而且每次都要帶上這個(gè).value實(shí)在是不好看,而且寫起來(lái)也麻煩呀!

reactive的弊端是不能解構(gòu),解構(gòu)就會(huì)失去響應(yīng)性:

  1. <script setup> 
  2. import { reactive } from 'vue' 
  3.  
  4. const user = reactive({ 
  5.   name'令狐沖'
  6.   age: 22, 
  7.   gender: '男' 
  8. }) 
  9.  
  10. // 這種寫法通常達(dá)不到預(yù)期的效果 
  11. let { age } = user 
  12. age = 18 
  13. </script> 

 

可能有人會(huì)說(shuō),不是有toRefs嗎?用了toRefs,就又會(huì)回到那個(gè).value的問(wèn)題上了:

  1. <script setup> 
  2. import { reactive, toRefs } from 'vue' 
  3.  
  4. const user = reactive({ 
  5.   name'令狐沖'
  6.   age: 22, 
  7.   gender: '男' 
  8. }) 
  9.  
  10. let { age } = toRefs(user
  11. age.value = 18 
  12. </script> 

 

其實(shí)我個(gè)人覺得還好啦,因?yàn)橐呀?jīng)寫習(xí)慣了,再加上一直用TS有提示和自動(dòng)補(bǔ)全,所以感覺沒什么問(wèn)題。

但知乎上類似于《為什么 vue3 刪不掉 ref() 這樣冗余的函數(shù),但 svelte 可以?》這種問(wèn)題深深的刺痛了大佬的內(nèi)心,大佬自己的強(qiáng)迫癥也犯了,畢竟他當(dāng)年創(chuàng)造Vue的最成功要素之一就是方便。而如今這種冗余的寫法卻與方便毫不搭邊兒,所以尤大無(wú)論如何也必須要解決這個(gè)問(wèn)題,不能讓人背后嚼耳根子說(shuō)Vue寫起來(lái)還沒Svelte方便是不是?于是乎大佬先后創(chuàng)建了三次不同的語(yǔ)法糖,它們分別是:

  • 《[譯]尤雨溪: Ref語(yǔ)法糖提案》
  • 《Vue第二波ref語(yǔ)法提案來(lái)襲 這次會(huì)進(jìn)入到標(biāo)準(zhǔn)嗎?》
  • 本文 (第二波語(yǔ)法糖的修改版)

我們先來(lái)簡(jiǎn)單的看一下,這三次語(yǔ)法糖的寫法:

第一波語(yǔ)法糖

第一波主要是模仿了Svelte的寫法,我們先來(lái)看看Svelte的中文官網(wǎng)給出來(lái)的一段例子:

  1. <script> 
  2. export let title; 
  3.  
  4. // 這將在“title”的prop屬性更改時(shí)更新“document.title” 
  5. $: document.title = title; 
  6.  
  7. $: { 
  8.   console.log(`multiple statements can be combined`); 
  9.   console.log(`the current title is ${title}`); 
  10. </script> 

 

這個(gè)$:是一種叫做label的語(yǔ)法,這種語(yǔ)法并不是Svelte自創(chuàng)的語(yǔ)法,而是一種長(zhǎng)期在被廢棄的邊緣上瘋狂試探的合法語(yǔ)法,只不過(guò)這種語(yǔ)法原本并不是這么用的,人家是用在嵌套循環(huán)上的:

 

  1. let num = 0 
  2.  
  3. outermost: 
  4. for (let i = 0; i < 10; i++) { 
  5.     for (let j = 0; j < 10; j++) { 
  6.         if (i == 5 && j == 5) { 
  7.             continue outermost 
  8.         } else { 
  9.             console.log(i, j, 88) 
  10.         } 
  11.         num++ 
  12.     } 
  13.  
  14. console.log(num) //95 

看不懂沒關(guān)系啊,也沒必要去弄懂這種語(yǔ)法,因?yàn)樗粔蛑庇^,用處也不是很大,所以幾乎沒什么人用它!我在編輯器寫這段代碼的時(shí)候 ESLint 都直報(bào)錯(cuò):

 

Vue3又出新語(yǔ)法 到底何時(shí)才能折騰完?

翻譯:Label語(yǔ)法源于GOTO語(yǔ)句,使用它將會(huì)令代碼變得難以理解、難以維護(hù)。—ESLint

不過(guò)既然沒什么人在用,同時(shí)它還是JS的合法語(yǔ)法,那用它來(lái)告訴編譯器這里是聲明了一個(gè)ref變量豈不是很完美?于是乎尤大也搞了個(gè)和Svelte類似的語(yǔ)法:

  1. <script setup> 
  2. ref: isLoading = true 
  3.  
  4. if (isLoading) { 
  5.   isLoading = false 
  6. </script> 

 

那么大家為何會(huì)如此反對(duì)呢?就是因?yàn)閘abel語(yǔ)法壓根兒就不是這么用的,人家原本是為了和break、continue配合使用的,雖然在別的地方用也不算是語(yǔ)法錯(cuò)誤,但你這么做明顯是修改了JS原本的語(yǔ)意!雖然尤大表示很不服啊:為什么Svelte用這玩意你們都沒說(shuō)啥,我一用這玩意你們就開噴?!

個(gè)人感覺是因?yàn)镾velte從一開始就說(shuō)自己是一個(gè)編譯器,沒有沉重的歷史包袱,而Vue卻恰恰相反。而且Svelte本身也不是什么主流框架,屬于給那幫愛折騰的人玩的。但Vue不一樣,已經(jīng)有多少人要靠著Vue吃飯呢,并不是所有人都那么愛折騰的。

于是在萬(wàn)般無(wú)奈之下,尤大只好放棄了這個(gè)提案,但這件事在尤大心里始終還是揮之不去、如鯁在喉,于是乎他吸取了第一波語(yǔ)法糖的教學(xué),卷頭重來(lái)又起草了一份新提案:

第二波語(yǔ)法糖

  1. <script setup> 
  2. let loading = $ref(true
  3.  
  4. if (loading) { 
  5.   loading = false 
  6. </script> 

 

可以看到我們并沒有引入$ref這個(gè)變量,這個(gè)變量是從哪來(lái)的的呢?是只要在<script>標(biāo)簽里寫了setup這個(gè)屬性就會(huì)自動(dòng)注入的一個(gè)全局變量(需要先開啟實(shí)驗(yàn)性語(yǔ)法開關(guān))

尤大心想:你們不是嫌我之前用了不規(guī)范的語(yǔ)法么?那我這回這么寫應(yīng)該沒問(wèn)題了吧!想想之前我們定義一個(gè)ref變量,首先需要先把ref引進(jìn)來(lái)然后才能用:

  1. import { ref } from 'vue'  
  2. const loading = ref(true

而新語(yǔ)法不用引,直接就能用,類似于全局變量的感覺。除了$ref這個(gè)特殊的全局變量呢,這次提案還有:$computed、$fromRefs和$raw這幾個(gè)玩意。我們一個(gè)個(gè)來(lái)看,先看$computed:

  1. <!-- 以前 --> 
  2. <script setup> 
  3. import { ref, computed } from 'vue' 
  4.  
  5. const num = ref(1) 
  6. const num_10 = computed(() => num.value * 10) 
  7. </script> 
  8.  
  9. <!-- 現(xiàn)在 --> 
  10. <script setup> 
  11. let num = $ref(1) 
  12. const num_10 = $computed(() => num * 10) 
  13. </script> 

 

$fromRefs又是個(gè)啥呢?這玩意在之前沒有啊!只聽說(shuō)過(guò)toRefs:

  1. <script setup> 
  2. import { fromRefs } from 'vue' // 這個(gè)API并不存在 
  3. import { toRefs } from 'vue' // 這個(gè)API倒是有 也就是只有 to 沒有 from 
  4. </script> 

 

其實(shí)這個(gè)$fromRefs正是為了配合toRefs而產(chǎn)生的,比方說(shuō)我們?cè)趧e的地方寫了一個(gè)useXxx:

 

  1. import { reactive } from 'vue' 
  2.  
  3. const state = reactive({ 
  4.     x: 0, 
  5.     y: 0 
  6. }) 
  7.  
  8. export default = (x = 0, y = 0) => { 
  9.     state.x = x 
  10.     state.y = y 
  11.      
  12.     return toRefs(state) 

于是我們?cè)谑褂玫臅r(shí)候就:

  1. <script setup> 
  2. import { useXxx } form '../useXxx.js' 
  3.  
  4. const { x, y } = useXxx(100, 200) 
  5.  
  6. console.log(x.value, y.value) 
  7. </script> 

 

這豈不是又要出現(xiàn)尤大最不想看到的.value屬性了嗎?所以$fromRefs就是為了解決這個(gè)問(wèn)題而生的:

  1. <script setup> 
  2. import { useXxx } form '../useXxx.js' 
  3.  
  4. const { x, y } = $fromRefs(useXxx(100, 200)) 
  5.  
  6. console.log(x, y) 
  7. </script> 

 

最后一個(gè) API 就是$raw了,raw 不是原始的意思嘛!那么看名字也能猜到,就是我們用$ref所創(chuàng)建出來(lái)的其實(shí)是一個(gè)響應(yīng)式對(duì)象,而不是一個(gè)基本數(shù)據(jù)類型,但語(yǔ)法糖會(huì)讓我們?cè)谑褂玫倪^(guò)程中像是在用基本數(shù)據(jù)類型那樣可以改來(lái)改去,但有時(shí)我們想看看這個(gè)對(duì)象長(zhǎng)什么樣,那么我們就需要用到$raw了:

  1. <script setup> 
  2. const loading = $ref(true
  3.  
  4. console.log(loading) // 其實(shí)打印的不是 loading 這個(gè)對(duì)象 而是它里面的值 相當(dāng)于 loading.value 
  5. console.log($raw(loading)) // 這回打印的就是 loading 這個(gè)對(duì)象了 
  6. </script> 

 

改進(jìn)版

這一版語(yǔ)法糖沒過(guò)多久就又被改進(jìn)了,改進(jìn)版主要是把全局變量改為只有$和$$這倆變量了,假如我們不用語(yǔ)法糖時(shí)是這么寫:

 

  1. <script setup> 
  2. import { ref } from 'vue' 
  3.  
  4. const loading = ref(true
  5.  
  6. console.log(loading.value) 
  7. </script> 

 

用語(yǔ)法糖以后就變成了這樣:

  1. <script setup> 
  2. import { ref } from 'vue' 
  3.  
  4. const loading = $(ref(true)) 
  5.  
  6. console.log(loading) 
  7. </script> 

 

如果我們想還原 loading 這個(gè)變量,我們就需要用到$$了:

  1. <script setup> 
  2. import { ref } from 'vue' 
  3.  
  4. let loading = $(ref(true)) 
  5.  
  6. console.log($$(loading)) 
  7. </script> 

 

或者也可以寫成這樣:

  1. <script setup> 
  2. import { ref } from 'vue' 
  3.  
  4. const loadingRef = ref(true
  5. let loading = $(loadingRef) 
  6.  
  7. console.log(loadingRef === $$(loading)) 
  8. </script> 

 

第三波語(yǔ)法糖

第三波語(yǔ)法糖主要是在第二波語(yǔ)法的基礎(chǔ)上又進(jìn)行了改進(jìn),除了許多人覺得要寫成$(ref())的話實(shí)在是太那什么了…

另一方面則是實(shí)現(xiàn)了props的語(yǔ)法糖,新的語(yǔ)法主要是為每個(gè)能夠創(chuàng)建帶有.value變量的方法都有一個(gè)$前綴的等價(jià)物,比如:

  • ref
  • computed
  • shallowRef
  • customRef
  • toRef

與此同時(shí)保留了改進(jìn)版中的$變量與$$變量,用于對(duì)props的解構(gòu):

  1. <script setup> 
  2. const { isLoading } = $(defineProps({ isLoading: Boolean })) 
  3. </script> 

 

要知道在以前我們是不能對(duì)props進(jìn)行解構(gòu)的,而現(xiàn)在還可以利用ES6的解構(gòu)默認(rèn)值寫法來(lái)為props設(shè)置默認(rèn)值:

  1. <!-- 以前 --> 
  2. <script setup> 
  3. const props = defineProps({ 
  4.   isLoading: { 
  5.     type: Boolean, 
  6.     defaulttrue 
  7.   } 
  8. })) 
  9.  
  10. console.log(props.isLoading) 
  11. </script> 
  12.  
  13. <!-- 現(xiàn)在 --> 
  14. <script setup> 
  15. const { isLoading = true } = $(defineProps({ isLoading: Boolean })) 
  16.  
  17. console.log(isLoading) 
  18. </script> 

 

 

三波語(yǔ)法糖提案地址

  • 第一波:github.com/vuejs/rfcs/…
  • 第二波:github.com/vuejs/rfcs/…
  • 第三波:github.com/vuejs/rfcs/…

這個(gè)框架明明是中國(guó)人用的最多,但可笑的是居然是一群外國(guó)人在商量Vue的下一步計(jì)劃,看到這里肯定有人會(huì)說(shuō):中國(guó)人都忙著996呢,哪有空去探討那些東西…

那就看你是覺得:這些亂七八糟的語(yǔ)法糖對(duì)你來(lái)說(shuō)無(wú)所謂,出什么語(yǔ)法我學(xué)什么就是了,我就是一只沉默的羔羊。

還是說(shuō):你只是在這篇文章的下面留個(gè)言說(shuō)自己喜歡這些新語(yǔ)法或者討厭這些新語(yǔ)法,懶得去GitHub說(shuō)英文。

鏈接已經(jīng)給大家貼上來(lái)了,就看大家是一副湊熱鬧的態(tài)度,還是點(diǎn)進(jìn)去鏈接勇敢的表達(dá)出自己的聲音了。當(dāng)然,如果去GitHub我們還是要說(shuō)英文的,雖說(shuō)用中文的話尤大也可以看得懂,但評(píng)論區(qū)不全是中國(guó)人,Vue還是有相當(dāng)一批外國(guó)粉絲的。而且也不全是美國(guó)人,那些不是英國(guó)人美國(guó)人的開發(fā)者,他們?nèi)绻仓粓D自己痛快而說(shuō)自己國(guó)家的母語(yǔ)的話,想必我們就沒有辦法進(jìn)行溝通了,同時(shí)這也會(huì)進(jìn)一步拉近國(guó)人在海外的形象:別人都用英文,就你們中國(guó)人用自己的語(yǔ)言,不遵守規(guī)則。

那可能有人英文水平真的很差,我們可以這樣嘛:找到百度翻譯,輸入中文后翻譯成英文,然后再把英文復(fù)制過(guò)去。雖然這樣做翻譯的可能不完全準(zhǔn)確,但最起碼能達(dá)到勉強(qiáng)看懂的地步。同時(shí)還有一個(gè)技巧就是把翻譯成英文的句子再翻譯回中文,看看有哪些地方的語(yǔ)意發(fā)生了明顯的變化,我們?cè)籴槍?duì)那個(gè)地方重新自己寫一遍。

如果你喜歡這個(gè)語(yǔ)法,那就去多點(diǎn)幾個(gè)贊多夸幾句,這樣的話想必它很快就會(huì)被納入到Vue的標(biāo)準(zhǔn)語(yǔ)法里面去。

如果你不喜歡,那么就趕快去多噴幾句,這樣的話這個(gè)語(yǔ)法很有可能就會(huì)像第一波語(yǔ)法糖提案那樣被放棄掉了。

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2022-03-24 20:42:19

Vue3API 設(shè)計(jì)Vue

2025-08-08 00:00:00

2021-04-24 08:17:25

比特幣區(qū)塊鏈加密貨幣

2021-12-01 08:11:44

Vue3 插件Vue應(yīng)用

2021-04-26 10:13:04

顯卡硬盤加密

2011-11-08 10:30:05

Eclipse

2023-04-27 11:07:24

Setup語(yǔ)法糖Vue3

2012-11-20 16:23:19

飛輪UPS數(shù)據(jù)中心電源

2021-11-30 08:19:43

Vue3 插件Vue應(yīng)用

2023-11-28 09:03:59

Vue.jsJavaScript

2020-09-19 21:15:26

Composition

2022-01-06 08:36:54

Vue3 插件Vue應(yīng)用

2024-03-15 08:45:31

Vue 3setup語(yǔ)法

2024-10-12 08:01:53

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2025-11-19 08:23:42

2009-04-23 13:10:11

AMDNehalemintel

2025-10-17 07:10:00

前端開發(fā)Vue

2010-11-10 10:19:24

大學(xué)生

2022-07-13 10:07:31

vue3組件監(jiān)聽器
點(diǎn)贊
收藏

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

日韩在线观看免费高清| 欧美视频在线观看 亚洲欧| 欧美国产亚洲视频| 亚洲欧美视频一区二区| 国产精品一二三四五| 国产在线精品播放| 麻豆精品久久| 亚洲第一页在线| 最新69国产成人精品视频免费| 久久精品影视伊人网| a级在线观看| jizzjizzjizz亚洲女| 亚洲韩日在线| 欧美激情一区二区三区在线| 色姑娘综合网| 快射av在线播放一区| 国产视频在线观看一区二区三区| 精品国产一区二区三区四区精华| 国产精品99久久免费观看| 亚洲国产另类久久精品| 天堂av在线7| 亚洲视频你懂的| 免费黄色日本网站| 日韩欧乱色一区二区三区在线| 欧美三片在线视频观看| 麻豆影视在线观看| 中文字幕在线观看不卡视频| 欧美精品久久久久久久久久久| 视频一区中文字幕| 激情伦成人综合小说| 999久久久亚洲| 国产精品678| 国语一区二区三区| 久久超碰97中文字幕| 成人深夜直播免费观看| 美女福利一区| 欧美成aaa人片免费看| 欧美一区国产| 亚洲欧洲日本专区| 美女网站在线看| 日韩精品在线观| 阿v视频在线| 亚洲乱码国产乱码精品精| www.51av欧美视频| 亚洲精品福利在线| 欧美日韩视频免费观看| 精品国产麻豆免费人成网站| 亚洲精品成人| 免费在线看成人av| 户外露出一区二区三区| 欧美日韩mp4| 久久精品综合一区| 欧美激情aⅴ一区二区三区| 91久久久久久久久久| 围产精品久久久久久久| av免费观看久久| 国产亚洲永久域名| 黄色小视频大全| 久久亚洲二区三区| 草草影院在线| 日本久久精品电影| 日本在线视频观看| 亚洲国产91色在线| 欧美va视频| 久久久亚洲成人| 中文字幕在线观看日本| 欧美欧美欧美欧美首页| segui88久久综合| 中文字幕亚洲欧美日韩高清| 成年免费网站| 91在线三级| 欧美精品videosex性欧美| 亚洲精品少妇30p| av在线播放网站| 欧美日韩精品免费在线观看视频| 国产亚洲精品中文字幕| 99精品视频在线免费播放| 97超碰青青草| 91精品国产欧美一区二区| 亚洲亚裔videos黑人hd| 美女视频亚洲色图| 欧美日韩黄色一级片| 亚洲国产高潮在线观看| 亚洲嫩模一区| 国语自产精品视频在线看抢先版图片| 黑人欧美xxxx| 黄色激情在线视频| 91九色综合久久| 亚洲欧美激情另类校园| 久久精品国产久精国产爱| 祥仔av免费一区二区三区四区| www.成人69.com| 欧美国产日韩在线观看| 国产成人免费xxxxxxxx| 日韩国产欧美| 日韩免费影院| 超污网站在线观看| 成人免费毛片网| 国产精品27p| 亚洲小说欧美激情另类| 亚洲国产精品精华液ab| 亚洲日本va午夜在线电影| 国产在线青青草| 日韩性感在线| 欧美性猛交xxxx| 亚洲不卡av不卡一区二区| 四虎影院观看视频在线观看| caoporn免费在线| 日本欧洲一区| 欧美一区三区二区在线观看| 一本一道久久a久久精品逆3p | 国产精品沙发午睡系列990531| 国产亚洲一区二区三区不卡| 成人视屏在线观看| 蜜桃传媒av| 欧美香蕉爽爽人人爽| 精品人妻大屁股白浆无码| 国产精品素人视频| 欧美黑人粗大| 中文字幕免费高| 国产精品欧美一区二区| 精品中文字幕视频| 亚洲视频在线观看| 亚洲精品免费播放| 亚洲视频综合| 色999韩欧美国产综合俺来也| 欧洲亚洲两性| zzzwww在线看片免费| 视频二区在线| 四虎4hu新地址入口2023| www.好吊操| 在线观看免费国产小视频| 免费观看欧美大片| 成人羞羞在线观看网站| 最近中文字幕mv免费高清在线| 久久综合88中文色鬼| 亚洲图片自拍偷拍| 激情欧美丁香| 成人性生交大片免费看中文视频 | 国产成人在线看| 欧美日韩伊人| 精品视频免费| 亚洲网站在线播放| 欧美日韩在线三级| 精品福利在线导航| 2019精品视频| 亚洲春色在线视频| 成人小视频在线看| gay网站在线| free性m.freesex欧美| 136福利精品导航| 国产麻豆日韩欧美久久| 亚瑟在线精品视频| 日韩中文有码在线视频| 国产精品av一区| 91免费黄视频| 91精选在线| 色黄视频在线观看| 国产精品亚洲欧美一级在线| 日本成人7777| 久久久久久美女精品| 久久99国产精品视频| 欧美国产美女| 午夜欧美理论片| 91影院在线观看| 亚洲人一二三区| 在线观看三级视频欧美| 日韩三区在线观看| 欧美区二区三区| 精品国产一区二区三区麻豆免费观看完整版 | 91a在线视频| 一本久道久久综合中文字幕| 成人精品免费视频| 在线精品一区| 日韩激情毛片| 老牛影视av一区二区在线观看| av片在线看| 99只有精品| 亚洲xxx拳头交| 成人黄色a**站在线观看| 五月婷婷在线视频| 日韩av电影免费观看高清| 亚洲 国产 日韩 综合一区| 黄网址在线播放免费| 国产精品一二三产区| 亚洲高清不卡| 亚洲成a人在线观看| 久久免费视频网站| 51xx午夜影福利| 2020日本在线视频中文字幕| 日韩欧美大片| 国产欧美精品一区| 欧美日韩精品一二三区| 国产精品视频内| 亚洲一区二区在| 免费在线观看日韩视频| 国产区在线观看| 第四色在线一区二区| 国产一区二区三区四区在线观看| 中文字幕欧美日本乱码一线二线 |