setup

1.模板綁定

  • 直接返回模板綁定(非響應(yīng)式)
<template>{{data}}</template>
<script lang="ts">
export default {
  name: 'App',
  setup(){
      return {
        data:"數(shù)據(jù)元"
      }
  }
}
</script>
  • 響應(yīng)式
<template>
  <div>{{state.count}}</div>
  <div>{{count1}}</div>
  <div>{{name}}</div>
</template>

<script lang="ts">
interface state {
  count:number
}
interface Person{
  name:string
}
import { reactive, ref, toRefs } from '@vue/reactivity'
import { defineComponent } from '@vue/runtime-core'
export default defineComponent({
  name: 'App',
  setup(){
     const state = reactive<state>({
       count:0
     })
     const person = reactive<Person>({
       name:"小王"
     })
     //setup返回的 ref 在模板中訪問時是被自動淺解包的
     //因此不應(yīng)在模板中使用.value
     const count1 = ref<number>(1)
     return{
       state,
       count1,
       //將響應(yīng)式的對象變?yōu)槠胀▽ο?再解構(gòu)蜻底,在模板中就可以直接使用屬性,不用person.name
      ...toRefs<Person>(person) 
     }
  }
})
</script>

2.參數(shù)

setup(props:,context:){

}

2.1 props

  • 是由父組件傳遞下來的響應(yīng)式數(shù)據(jù)和reactive包裝的類型向相同聘鳞,均是proxy類型薄辅,因此不用再次對其進行響應(yīng)式包裝
  • 不能使用 ES6 解構(gòu)props,它會消除 prop 的響應(yīng)性抠璃,若想結(jié)構(gòu)props站楚,可以用toRefs,因為上面說了props是proxy式的響應(yīng)式數(shù)據(jù)搏嗡,所以用toRefs將其轉(zhuǎn)換為Ref響應(yīng)數(shù)據(jù)窿春,還能讓模板綁定更簡單
//Test.vue
<template>
  <h1>{{title}}</h1>
</template>

<script lang="ts">
import { defineComponent, watch, watchEffect } from "@vue/runtime-core";
export default defineComponent({
    name:"Test",
    props:{
        title:String
    },
    setup(props,context){
        console.log(props);
        //最初的時候執(zhí)行一次
        //變化的時候再次執(zhí)行
        watchEffect(()=>{
            console.log(props);
        })
        //僅變化的時候執(zhí)行
        watch(()=> props.title,newValue =>{
            console.log(newValue);
        })
    }
})
</script>

//App.vue
<template>
    <Test :title="title"></Test>
</template>

<script lang="ts">
import { reactive, ref, toRefs } from '@vue/reactivity'
import { defineComponent } from '@vue/runtime-core'
import Test from './components/Test.vue'
export default defineComponent({
  name: 'App',
  components:{
    Test
  },
  setup(){
    const title = ref<string>("我是vue")
    console.log(title);
    setTimeout(() => {
      title.value = "我是vue3.0"
      console.log(title)
    }, 2000);
    return {
      title
    }
  }
})
</script>
  • 如果 title 是可選的 prop,則傳入的 props 中可能沒有 title 采盒。在這種情況下旧乞,toRefs 將不會為 title 創(chuàng)建一個 ref 。你需要使用 toRef 替代它:
<template>
  <h1>{{title}}</h1>
</template>

<script lang="ts">
import { defineComponent, toRef, toRefs, watch, watchEffect } from "@vue/runtime-core";
export default defineComponent({
    name:"Test",
    props:{
        title:String
    },
    setup(props,context){
        console.log(props);
        const  title  = toRef(props,'title')
        //最初的時候執(zhí)行一次
        //變化的時候再次執(zhí)行
        watchEffect(()=>{
            console.log(title.value);
        })
        //僅變化的時候執(zhí)行
        watch(()=> title,newValue =>{
            console.log(newValue);
        })
    }
})
</script>

2.2context

  • context包含三個屬性:attrs纽甘、slotsemit
  • 由于context是非響應(yīng)式的决瞳,因此可以在setup中對其進行解構(gòu)
export default {
  setup(props, { attrs, slots, emit }) {
    ...
  }
}
  • attrsslots 是有狀態(tài)的對象左权,它們總是會隨組件本身的更新而更新赏迟。這意味著你應(yīng)該避免對它們進行解構(gòu),并始終以 attrs.xslots.x 的方式引用 property甩栈。與 props 不同量没,attrsslots是非響應(yīng)式的。如果你打算根據(jù) attrsslots 更改對應(yīng)業(yè)務(wù)邏輯究抓,那么應(yīng)該在 onUpdated 生命周期鉤子中執(zhí)行此操作刺下。

  • attrs與props的不同
    • props 要先聲明才能取值稽荧,attrs 不用先聲明
    • props 聲明過的屬性蛤克,attrs 里不會再出現(xiàn)
    • props 不包含事件,attrs 包含
    • props 支持 string 以外的類型髓介,attrs 只有 string 類型
<template>
  <h1>{{title}}</h1>
</template>

<script lang="ts">
import { defineComponent, toRef, toRefs, watch, watchEffect } from "@vue/runtime-core";
export default defineComponent({
    name:"Test",
    setup(props,context){
       console.log(context.attrs);
       return {
          ...toRefs(context.attrs)
       }
    }
})
</script>
<template>
  <h1>{{title}}</h1>
</template>

<script lang="ts">
import { defineComponent, toRef, toRefs, watch, watchEffect } from "@vue/runtime-core";
export default defineComponent({
    name:"Test",
    setup(props,context){
       console.log(context.attrs);
       return {
          //失去響應(yīng)性
          ...context.attrs
       }
    }
})
</script>
<template>
  <h1>{{attrs.title}}</h1> 
</template>

<script lang="ts">
import { defineComponent, toRef, toRefs, watch, watchEffect } from "@vue/runtime-core";
export default defineComponent({
    name:"Test",
    setup(props,context){
       console.log(context.attrs);
       return {
          attrs:context.attrs
       }
    }
})
</script>

  • emit:用于父子通信
<template>
  <h1>{{count}}</h1>
  <button @click="plus(3)">增加</button>
</template>

<script lang="ts">
import { defineComponent, SetupContext, toRef, toRefs, watch, watchEffect } from "@vue/runtime-core";
export default defineComponent({
    name:"Test",
    props:{
        count:Number
    },  
    emits:['plus'],
    setup(props,context:SetupContext){
      const plus:(num: number) => void = (num:number)=>{
          context.emit('plus',num)
      }
      return {
          plus
      }
    }
})
</script>


<template>
    <Test :count="count" @plus="plus"></Test>
</template>

<script lang="ts">
import { reactive, ref, toRefs } from '@vue/reactivity'
import { defineComponent } from '@vue/runtime-core'
import Test from './components/Test.vue'
export default defineComponent({
  name: 'App',
  components:{
    Test
  },
  setup(){
    const count = ref<number>(1)
    const plus:(num: number) => void = (num:number):void=>{
      count.value += num
    }
    return {
      count,
      plus
    }
  }
})
</script>

3.this

VUE2 VUE3
beforeCreate setup
created setup
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeDestroy onBeforeUnmount
destroyed onUnmounted
errorCaptured onErrorCaptured

setup中的thisundefined

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一膨,一起剝皮案震驚了整個濱河市洒沦,隨后出現(xiàn)的幾起案子申眼,更是在濱河造成了極大的恐慌,老刑警劉巖巷蚪,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件濒翻,死亡現(xiàn)場離奇詭異,居然都是意外死亡淌喻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門啸臀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豌注,你說我怎么就攤上這事∶看希” “怎么了齿风?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵救斑,是天一觀的道長。 經(jīng)常有香客問我穷娱,道長运沦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任嫁盲,我火速辦了婚禮羞秤,結(jié)果婚禮上向叉,老公的妹妹穿的比我還像新娘。我一直安慰自己母谎,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布幸斥。 她就那樣靜靜地躺著,像睡著了一般廊勃。 火紅的嫁衣襯著肌膚如雪经窖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天冰悠,我揣著相機與錄音溉卓,去河邊找鬼搬泥。 笑死,一個胖子當著我的面吹牛尉尾,可吹牛的內(nèi)容都是我干的代赁。 我是一名探鬼主播兽掰,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼孽尽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杉女?” 一聲冷哼從身側(cè)響起熏挎,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烦磁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呕乎,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陨晶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了湿刽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叭爱。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡漱病,死狀恐怖杨帽,靈堂內(nèi)的尸體忽然破棺而出注盈,到底是詐尸還是另有隱情,我是刑警寧澤老客,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布胧砰,位于F島的核電站尉间,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哲嘲。R本人自食惡果不足惜眠副,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一囱怕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧光涂,春花似錦、人聲如沸钝计。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荣德,卻和暖如春涮瞻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背署咽。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工宁否, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缀遍,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓絮重,卻偏偏與公主長得像青伤,于是被迫代替她去往敵國和親狠角。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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