Vue3中setup語法糖學(xué)習(xí)

1蓝谨,前言


<script setup>是在單文件組件中使用Composition API的編譯時語法糖走越。相比于普通的<script>語法染厅,它具有更多優(yōu)勢

  • 更少的樣板內(nèi)容捌朴,更簡潔的代碼
  • 能夠使用純 Typescript 聲明 props 和拋出事件
  • 更好的運行時性能 (其模板會被編譯成與其同一作用域的渲染函數(shù),沒有任何的中間代理)
  • 更好的 IDE 類型推斷性能 (減少語言服務(wù)器從代碼中抽離類型的工作)

2信粮,基本語法


<template>
  <p>{{ name }}</p>
</template>

<script setup lang="ts">
    let name = '小明'
</script>

script里面的代碼會被編譯成組件setup()函數(shù)的內(nèi)容黔攒。這意味著與普通的<script>只在組件被首次引入的時候執(zhí)行一次不同,<script setup>中的代碼會在每次組件實例被創(chuàng)建的時候執(zhí)行。

注意:當(dāng)使用<script setup>的時候督惰,任何在<script setup>聲明的頂層的綁定 (包括變量不傅,函數(shù),以及import引入的內(nèi)容) 都能在模板中直接使用赏胚,不需要return

2访娶,響應(yīng)式


響應(yīng)式狀態(tài)需要使用響應(yīng)式APIs來創(chuàng)建

<template>
  <p>{{ name }}</p>
  <p>{{ data.title }}</p>
</template>

<script setup lang="ts">
  import { ref, reactive } from 'vue'

  let name = ref('小明')
  let data = reactive({
    title: '標(biāo)題'
  })
</script>

3,組件使用


<script setup>范圍里的值也能被直接作為自定義組件的標(biāo)簽名使用觉阅,不需要寫在conmonent對象里

<template>
  <MyComponent />
</template>

<script setup>
    import MyComponent from './MyComponent.vue'
</script>

3.1崖疤,動態(tài)組件

由于組件被引用為變量而不是作為字符串鍵來注冊的,在<script setup>中要使用動態(tài)組件的時候典勇,就應(yīng)該使用動態(tài)的:is來綁定

<template>
  <component :is="Foo" />
  <component :is="someCondition ? Foo : Bar" />
</template>

<script setup>
    import Foo from './Foo.vue'
    import Bar from './Bar.vue'
</script>

3.2劫哼,遞歸組件

一個單文件組件可以通過它的文件名被其自己所引用。例如:文件名為Foo.vue的組件可以在其模板中用<Foo/>引用它自己割笙。如果名稱沖突了权烧,就需要使用別名。

import { Foo as FooBarChild } from './components'

4伤溉,自定義指令


全局注冊的自定義指令將以符合預(yù)期的方式工作般码,且本地注冊的指令可以直接在模板中使用,就像上文所提及的組件一樣乱顾。但這里有一個需要注意的限制:必須以 vNameOfDirective的形式來命名本地自定義指令板祝,以使得它們可以直接在模板中使用

  • 基本語法
<template>
  <h1 v-my-directive>This is a Heading</h1>
</template>

<script setup>
    const vMyDirective = {
      beforeMount: (el) => {
        // 在元素上做些操作
      }
    }
</script>
  • 導(dǎo)入指令
<script setup>
  // 導(dǎo)入的指令同樣能夠工作,并且能夠通過重命名來使其符合命名規(guī)范
  import { myDirective as vMyDirective } from './MyDirective.js'
</script>

5走净,props


<script setup>中必須使用defineProps來聲明props券时,它具備完整的類型推斷并且在<script setup>中是直接可用的

<script setup>
    const props = defineProps({
      foo: String
    })
</script>

5.1,TypeScript支持

  • 僅限類型聲明
const props = defineProps<{
  foo: string
  bar?: number
}>()
  • 默認(rèn)值
interface Props {
  msg?: string
  labels?: string[]
}

const props = withDefaults(defineProps<Props>(), {
  msg: 'hello',
  labels: () => ['one', 'two']
})

6温技,emit


<script setup>中必須使用defineEmits來聲明emits革为,它具備完整的類型推斷并且在<script setup>中是直接可用的

<script setup>
    const emit = defineEmits(['change', 'delete'])
</script>

6.1,TypeScript支持

  • 僅限類型聲明
const emit = defineEmits<{
  (e: 'change', id: number): void
  (e: 'update', value: string): void
}>()

7舵鳞,defineExpose暴露


使用<script setup>的組件是默認(rèn)關(guān)閉的震檩,也即通過模板ref或者$parent鏈獲取到的組件的公開實例,不會暴露任何在<script setup>中聲明的綁定

<script setup>
    import { ref } from 'vue'
    
    const a = 1
    const b = ref(2)
    
    defineExpose({
      a,
      b
    })
</script>

8蜓堕,useSlots 和 useAttrs


在模板中通過$slots$attrs來訪問它們

<script setup>
    import { useSlots, useAttrs } from 'vue'
    
    const slots = useSlots()
    const attrs = useAttrs()
</script>

9抛虏,與普通的script一起使用


<script setup>可以和普通的<script>一起使用。普通的<script>在有這些需要的情況下或許會被使用到套才。

  • 無法在<script setup>聲明的選項迂猴,例如inheritAttrs或通過插件啟用的自定義的選
  • 聲明命名導(dǎo)出
  • 運行副作用或者創(chuàng)建只需要執(zhí)行一次的對象
<script>
    // 普通 <script>, 在模塊范圍下執(zhí)行(只執(zhí)行一次)
    runSideEffectOnce()
    
    // 聲明額外的選項
    export default {
      inheritAttrs: false,
      customOptions: {}
    }
</script>

<script setup>
    // 在 setup() 作用域中執(zhí)行 (對每個實例皆如此)
</script>

如果看了覺得有幫助的,我是@鵬多多11997110103背伴,歡迎 點贊 關(guān)注 評論沸毁;
END

PS:在本頁按F12峰髓,在console中輸入document.querySelectorAll('._2VdqdF')[0].click(),有驚喜哦

往期文章

個人主頁

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搂誉,一起剝皮案震驚了整個濱河市徐紧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炭懊,老刑警劉巖并级,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侮腹,居然都是意外死亡嘲碧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門父阻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呀潭,“玉大人,你說我怎么就攤上這事至非。” “怎么了糠聪?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我席楚,道長腮猖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任身害,我火速辦了婚禮味悄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塌鸯。我一直安慰自己侍瑟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布丙猬。 她就那樣靜靜地躺著涨颜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧球。 梳的紋絲不亂的頭發(fā)上庭瑰,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音抢埋,去河邊找鬼弹灭。 笑死督暂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穷吮。 我是一名探鬼主播逻翁,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酒来!你這毒婦竟也來了卢未?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤堰汉,失蹤者是張志新(化名)和其女友劉穎辽社,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翘鸭,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡滴铅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了就乓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汉匙。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖生蚁,靈堂內(nèi)的尸體忽然破棺而出噩翠,到底是詐尸還是另有隱情,我是刑警寧澤邦投,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布伤锚,位于F島的核電站,受9級特大地震影響志衣,放射性物質(zhì)發(fā)生泄漏屯援。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一念脯、第九天 我趴在偏房一處隱蔽的房頂上張望狞洋。 院中可真熱鬧,春花似錦绿店、人聲如沸吉懊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惕它。三九已至,卻和暖如春废登,著一層夾襖步出監(jiān)牢的瞬間淹魄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工堡距, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留甲锡,地道東北人兆蕉。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像缤沦,于是被迫代替她去往敵國和親虎韵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容