Vue3.0的setup學(xué)習(xí)筆記

1罗洗、setup的理解

setup組件選項(xiàng)在組件創(chuàng)建前執(zhí)行,一旦props被解析,并充當(dāng)Composition API的入口,也就是說組合API是在setup這個(gè)選項(xiàng)函數(shù)中使用的光羞。

setup函數(shù)的注意點(diǎn)
  • 沒有this:由于在執(zhí)行setup的時(shí)候組件實(shí)例還沒創(chuàng)建成功,所以在setup中去打印this是undefined
  • setup執(zhí)行時(shí)間是在beforeCreated鉤子函數(shù)之前執(zhí)行的
  • setup函數(shù)不能為異步函數(shù):如果寫為異步怀大,頁面可能會(huì)出現(xiàn)問題
  • setup選項(xiàng)接受的兩個(gè)參數(shù):props和context函數(shù)

2纱兑、setup函數(shù)的返回值

如果setup返回一個(gè)對象,會(huì)將對象合并到render context中去化借,此時(shí)就能夠在組件template模板中使用該對象的屬性潜慎。

<template>
  <div class="about">
    <h1>{{count}}</h1>
  </div>
</template>
<script>
export default {
  name:'About',
  setup(){
    // 組合api是在setup這個(gè)選項(xiàng)API中使用
    return {
      count: 10
    }
  }
}
</script>
image.png

3、返回渲染函數(shù)

setup中可以返回一個(gè)渲染函數(shù),使用h去生成虛擬的DOM铐炫,Vue3.0支持直接return虛擬節(jié)點(diǎn)

注意:要從vue中引出來垒手,否則h是未定義的狀態(tài)

<template>
  <div class="about">
    <h1>{{count}}</h1>
  </div>
</template>
<script>
import {h} from 'vue'
export default {
  name:'About',
  setup(){
    return () => h('h1',{style:'color:red'},'這是createElement創(chuàng)建的DOM')
  }
}
</script>

image.png

4、setup接受的參數(shù)arguments

使用setup時(shí)驳遵,接受兩個(gè)參數(shù)props和context(上下文)淫奔,因?yàn)閟etup中不再有this了,因此props接受的值可以做為參數(shù)傳過來堤结,通過參數(shù)props去拿。

props參數(shù)

setup函數(shù)中的第一個(gè)參數(shù)是props鸭丛,props是響應(yīng)式的竞穷,當(dāng)傳入新的props,將會(huì)自動(dòng)更新鳞溉,因?yàn)樵趕etup函數(shù)中瘾带,this并不是組件對象,因此無法向選項(xiàng)中通過this.prop去獲取組件傳遞的數(shù)據(jù)熟菲,所以在setup函數(shù)中看政,將props通過參數(shù)的方式傳遞進(jìn)來,同時(shí)抄罕,props是響應(yīng)式的允蚣,當(dāng)修改父組件中的count時(shí),子組件的count會(huì)自動(dòng)發(fā)生變化呆贿。
父組件

<template>
  <div class="home">    
    <children :count="count"/>
    <button @click="change">+1</button>
  </div>
</template>

<script>
import children from '../components/children'
import {ref} from 'vue'
export default {
  components:{
    children
  },
  setup(){
    const count = ref(0);
    const change = () => {
      return count.value++;
    }
    return {
      count,
      change,
    }
  }
}
</script>

子組件寫法一

<template>
  <div>
    <h1>{{ count }}</h1>
  </div>
</template>

<script>
import {computed, toRefs} from 'vue';
export default{
  props:['count'],
  setup(props,{ emit }){
   let { count } = props;
    console.log(props.count)
   return {
     count
   }
  }
}
</script>

如果是這么直接解構(gòu)去拿count的話嚷兔,那么父組件修改了的count的值,子組件是不會(huì)跟著發(fā)生變化的做入,也可以理解為此時(shí)的count失去了活性冒晰。
那么有兩種辦法讓子組件的數(shù)據(jù)激活,一種是toRefs()方法竟块,另外一種是computed計(jì)算屬性
方法一:toRefs(props)

<template>
  <div>
    <h1>{{ count }}</h1>
  </div>
</template>

<script>
import {computed, toRefs} from 'vue';
export default{
  props:['count'],
  setup(props,{ emit }){
   let { count } = toRefs(props);
    console.log(props.count)
   return {
     count
   }
  }
}
</script>

image.png

方法二:computed()計(jì)算屬性

<template>
  <div>
    <h1>{{ count }}</h1>
  </div>
</template>

<script>
import {computed} from 'vue';
export default{
  props:['count'],
  setup(props,{ emit }){
   const count = computed({
     get:()=>props.count,
   })
   return {
     count
   }
  }
}
</script>
image.png

這樣壶运,父組件點(diǎn)擊按鈕加的值就會(huì)傳給子組件,顯示出來浪秘。

5蒋情、上下文context

setup函數(shù)接受的第二個(gè)參數(shù)是context,context是一個(gè)普通的javascript對象秫逝,他暴露出來的是三個(gè)組件的屬性恕出。

setup(props,context){
  console.log('打印context:',context)
  return{}
}
image.png

context 是一個(gè)普通的javascript對象,也就是說违帆,他不是響應(yīng)式的浙巫,因此,可以對其進(jìn)行ES6進(jìn)行解構(gòu)使用。

export default {
    setup(props, { attrs, slots, emit }) {
        //...
    }
}

context對象中的attrs以及slots是具有狀態(tài)的對象的畴,非響應(yīng)式的渊抄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丧裁,隨后出現(xiàn)的幾起案子护桦,更是在濱河造成了極大的恐慌,老刑警劉巖煎娇,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二庵,死亡現(xiàn)場離奇詭異,居然都是意外死亡缓呛,警方通過查閱死者的電腦和手機(jī)催享,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哟绊,“玉大人因妙,你說我怎么就攤上這事∑彼瑁” “怎么了攀涵?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洽沟。 經(jīng)常有香客問我以故,道長,這世上最難降的妖魔是什么玲躯? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任据德,我火速辦了婚禮,結(jié)果婚禮上跷车,老公的妹妹穿的比我還像新娘棘利。我一直安慰自己,他們只是感情好朽缴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布善玫。 她就那樣靜靜地躺著,像睡著了一般密强。 火紅的嫁衣襯著肌膚如雪茅郎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天或渤,我揣著相機(jī)與錄音系冗,去河邊找鬼。 笑死薪鹦,一個(gè)胖子當(dāng)著我的面吹牛掌敬,可吹牛的內(nèi)容都是我干的惯豆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼奔害,長吁一口氣:“原來是場噩夢啊……” “哼楷兽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起华临,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤芯杀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后雅潭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揭厚,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年寻馏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棋弥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诚欠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漾岳,到底是詐尸還是另有隱情轰绵,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布尼荆,位于F島的核電站左腔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捅儒。R本人自食惡果不足惜液样,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巧还。 院中可真熱鬧鞭莽,春花似錦睁本、人聲如沸皱卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惹资。三九已至笙纤,卻和暖如春仔沿,著一層夾襖步出監(jiān)牢的瞬間丹诀,已是汗流浹背走孽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工惧辈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人磕瓷。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓盒齿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子县昂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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