最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3 setup() 高級用法示例詳解

 更新時(shí)間:2021年11月19日 08:54:38   作者:前端人  
從 vue2 升級到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的選項(xiàng)式API。這篇文章主要介紹了vue3 setup() 高級用法,需要的朋友可以參考下

本篇文章干貨較多,建議收藏!

從 vue2 升級到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的選項(xiàng)式API。由于選項(xiàng)式API一個(gè)變量存在于多處,如果出現(xiàn)問題時(shí),就需要去多個(gè)函數(shù)內(nèi)檢查,項(xiàng)目較大時(shí),遇到問題,增加排故的難度。所以 vue3 中新增了 setup 配置項(xiàng),用它來寫組合式API。

一、選項(xiàng)式API 和 組合式API 區(qū)別

有些同學(xué)稀里糊涂用了vue一年了,竟然不知道選項(xiàng)式api !你是那個(gè)同學(xué)嗎?是的話,趕緊收藏起來。

vue2 中的 Options API 就是選項(xiàng)式api,一個(gè)中文,一個(gè)英文,怎么叫都可以。

在一個(gè) vue 文件內(nèi),會有 data、methods、mounted、computed、watch 等等用來定義屬性和方法,共同來處理頁面邏輯,我們把這種方式稱為 Options API。

示例1:計(jì)數(shù)器

<template>
 <div>
  <button @click="add">+</button>
   {{num}}
  <button @click="reduce">-</button>
 </div>
</template>
<script>
export default {
 data(){
  return {
   num:0
  }
 },
 methods:{
  add(){
   this.num++
  },
  reduce(){
   this.num--
  }
 }
}
</script>

觀察上述示例,我們發(fā)現(xiàn) num 值的處理涉及到 data 和 methods 兩個(gè)選項(xiàng),業(yè)務(wù)處理的比較分散,項(xiàng)目小了看著清晰明了,但是項(xiàng)目變大之后,data 和 methods會包含很多屬性和方法,此時(shí)就很難分清哪個(gè)屬性對應(yīng)哪個(gè)方法。所以 vue3 新增 setup 寫組合式API。

Vue3 的 Composition API 就是組合式api。

組合式api 就是一個(gè)功能所定義的 api 會放在一起,這樣子即使項(xiàng)目變大,功能增大,我們能夠很快找到功能相關(guān)的所有api,不像 Options API 功能分散,需要改動時(shí),需要多處查找過程比較困難。

示例2:計(jì)數(shù)器

<template>
 <div>
  <button @click="add">+</button>
   {{num}}
  <button @click="reduce">-</button>
 </div>
</template>
<script>
 import { ref } from 'vue'
 export default{
  setup(){
   const num = ref(1)
   return{
    num,
    add(){
     num.value++
    },
    reduce(){
     num.value--
   }
  }
 }
}
</script>

ref 是讓基礎(chǔ)數(shù)據(jù)類型具備響應(yīng)式的,下篇文章具體介紹它的用法,需要的同學(xué)可以點(diǎn)個(gè)關(guān)注不迷路!

用一張圖告訴你它們的區(qū)別:

二、setup 具體怎么用?

2.1、setup 什么時(shí)候執(zhí)行?

setup 用來寫組合式 api,從生命周期鉤子函數(shù)角度分析,相當(dāng)于取代了 beforeCreate 。會在 creted 之前執(zhí)行。

<script>
 export default{
  created(){
   console.log('created');
  },
  setup(){
   console.log('setup');
  }
 }
</script>

執(zhí)行之后,setup 打印結(jié)果始終在前邊。

2.2、setup 數(shù)據(jù)和方法如何使用?

示例3:直接定義使用變量

<template>
 {{a}}
</template>
<script>
 export default{
  setup(){
   const a = 0
  }
 }
</script>

運(yùn)行后發(fā)現(xiàn)結(jié)果異常:

runtime-core.esm-bundler.js?5c40:6584 [Vue warn]: Property "a" was accessed during render but is not defined on instance.

提示我們訪問的屬性 a 并沒有掛載到實(shí)例上。

setup 內(nèi)部的屬性和方法,必須 return 暴露出來,將屬性掛載到實(shí)例上,否則沒有辦法使用,上述代碼添加return:

<script>
 export default{
  setup(){
   const a = 0
   return{
    a
   }
  }
 }
</script>

2.3、setup 內(nèi)部有 this 嗎?

自己在 setup 中打印下 this ,返回結(jié)果 是undefined 。說明在 setup 內(nèi)部是不存在 this ,不能掛載 this 相關(guān)的東西。

2.4、setup 內(nèi)鉤子函數(shù)如何使用?

vue3 是可以兼容 vue2 的選項(xiàng)式寫法,所以 鉤子函數(shù)可以與 setup 并列存在,就相當(dāng)于 Options API。

示例4:

export default{
 setup(){
  console.log('setup');
 },
 mounted(){
  console.log('mounted');
 }
}

vue3 新增的 setup() 函數(shù)用來寫組合式 api,所以不建議這樣寫代碼。所以需要使用 onXXX 一族的函數(shù)來注冊鉤子函數(shù),注冊成功之后調(diào)用時(shí)傳遞的是一個(gè)回調(diào)函數(shù)。

示例5:

import { onMounted } from "vue";
export default{
 setup(){
  const a = 0
  return{
   a
  },
  onMounted(()=>{
   console.log("執(zhí)行");
 })
 }
}

注冊的這些生命周期鉤子函數(shù)只能在 setup 期間同步使用,因?yàn)樗鼈円蕾嚾謨?nèi)部狀態(tài)來定位當(dāng)前組件實(shí)例,不在當(dāng)前組件下調(diào)用函數(shù)時(shí)會拋出錯(cuò)誤。

其他的鉤子函數(shù)是一樣的,根據(jù)需要引入就好了。

2.5、setup與鉤子函數(shù)關(guān)系

setup 與鉤子函數(shù)并列時(shí),setup 不能調(diào)用生命周期相關(guān)函數(shù),但生命周期可以調(diào)用 setup 相關(guān)的屬性和方法。

示例6:

<template>
 <button @click="log">點(diǎn)我</button>
</template>
<script>
export default{
 setup(){
  const a = 0
  return{
   a
  }
 },
 methods:{
  log(){
   console.log( this.$options.setup() );//返回一個(gè)對象
  }
 }
}
</script>

this.$options.setup() 返回的是一個(gè)大對象,該對象內(nèi)包含了 setup 內(nèi)的所有屬性和方法。

三、setup 參數(shù)

使用setup 時(shí),它將接收兩個(gè)參數(shù):props 和 context 。

3.1、props

第一個(gè)參數(shù)是 props ,表示父組件給子組件傳值,props 是響應(yīng)式的,當(dāng)傳入新的 props 時(shí),自動更新。

示例7:

export default{
 props: {
  msg: String,
  ans: String,
 },
 setup(props,context){
  console.log(props);//Proxy {msg: "著急找對象", ans: "你有對象嗎?"}
 },
}

因?yàn)?props 是響應(yīng)式的,不能使用 ES6 解構(gòu),會消除prop的響應(yīng)特性,此時(shí)需要借用 toRefs 解構(gòu)。示例8:

import { toRefs } from "vue";
 export default{
  props: {
   msg: String,
   ans: String,
  },
  setup(props,context){
   console.log(props);
   const { msg,ans } = toRefs(props)
   console.log(msg.value); //著急找對象
   console.log(ans.value); //你有對象嗎?
  },
 }

使用組件時(shí),經(jīng)常會遇到可選參時(shí),有些地方需要傳遞某個(gè)值,有些時(shí)候不需要,該如何處理呢?

如果 ans 是一個(gè)可選參數(shù),則傳入 props 中可能沒有 ans 。在這種情況下 toRefs 將不會為 ans 創(chuàng)建一個(gè) ref ,需要使用 toRef 代替它。

import { toRef } from "vue";
setup(props,context){
 let ans  = toRef(props ,'ans')// 不存在時(shí),創(chuàng)建一個(gè)ans
 console.log(ans.value);
}

3.2、context

context 上下文環(huán)境,其中包含了 屬性、插槽、自定義事件三部分。

setup(props,context){
 const { attrs,slots,emit } = context
 // attrs 獲取組件傳遞過來的屬性值,
 // slots 組件內(nèi)的插槽
 // emit 自定義事件 子組件
}

attrs 是一個(gè)非響應(yīng)式對象,主要接收 no-props 屬性,經(jīng)常用來傳遞一些樣式屬性。

slots 是一個(gè) proxy 對象,其中 slots.default() 獲取到的是一個(gè)數(shù)組,數(shù)組長度由組件的插槽決定,數(shù)組內(nèi)是插槽內(nèi)容。

setup 內(nèi)不存在this,所以 emit 用來替換 之前 this.$emit 的,用于子傳父時(shí),自定義事件觸發(fā)。

示例9:

<template>
 <div :style="attrs.style">
  <slot></slot>  
  <slot name="hh"></slot>
  <button @click="emit('getVal','傳遞值')">子向父傳值</button> 
 </div> 
</template>
<script>
import { toRefs,toRef } from "vue";
export default{
 setup(props,context){
  const { attrs,slots,emit } = context
  // attrs 獲取組件傳遞過來 style 屬性
 console.log('slots',slots.default());//插槽數(shù)組
 console.log('插槽屬性',slots.default()[1].props); //獲取插槽的屬性   
 return{
  attrs,
  emit
   }
  },
 }
</script>

四、setup 特性總結(jié)

1、這個(gè)函數(shù)會在 created 之前執(zhí)行,上述已解釋。

2、setup 內(nèi)部沒有 this,不能掛載 this 相關(guān)的東西。

3、setup 內(nèi)部的屬性和方法,必須 return 暴漏出來,否則沒有辦法使用。

4、setup 內(nèi)部數(shù)據(jù)不是響應(yīng)式的。

5、setup不能調(diào)用生命周期相關(guān)函數(shù),但生命周期函數(shù)可以調(diào)用setup內(nèi)的函數(shù)。

到此這篇關(guān)于vue3 setup() 高級用法的文章就介紹到這了,更多相關(guān)vue3 setup() 用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3中使用jsx/tsx的教程詳解

    Vue3中使用jsx/tsx的教程詳解

    這篇文章主要為大家詳細(xì)介紹了如何在Vue3中使用jsx/tsx的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以了解下
    2024-02-02
  • Vue3.0在組件外使用VueI18n的情況

    Vue3.0在組件外使用VueI18n的情況

    這篇文章主要介紹了Vue3.0在組件外使用VueI18n的情況,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue實(shí)現(xiàn)輪播圖組件的封裝

    Vue實(shí)現(xiàn)輪播圖組件的封裝

    Vue輪播圖組件的封裝可通過封裝組件、使用插件、配置化等方式實(shí)現(xiàn),主要包括圖片預(yù)加載、定時(shí)輪播、無限滾動、手勢滑動、響應(yīng)式布局等功能,實(shí)現(xiàn)方式可使用Vue的生命周期函數(shù)、自定義事件、計(jì)算屬性等技術(shù)
    2023-04-04
  • JS 實(shí)現(xiàn)獲取對象屬性個(gè)數(shù)的方法小結(jié)

    JS 實(shí)現(xiàn)獲取對象屬性個(gè)數(shù)的方法小結(jié)

    這篇文章主要介紹了JS 實(shí)現(xiàn)獲取對象屬性個(gè)數(shù)的方法,結(jié)合實(shí)例形式總結(jié)分析了JS 獲取對象屬性個(gè)數(shù)的三種常用方法,需要的朋友可以參考下
    2023-05-05
  • vue使用better-scroll實(shí)現(xiàn)下拉刷新、上拉加載

    vue使用better-scroll實(shí)現(xiàn)下拉刷新、上拉加載

    這篇文章主要為大家詳細(xì)介紹了vue使用better-scroll實(shí)現(xiàn)下拉刷新、上拉加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • vue+element_ui上傳文件,并傳遞額外參數(shù)操作

    vue+element_ui上傳文件,并傳遞額外參數(shù)操作

    這篇文章主要介紹了vue+element_ui上傳文件,并傳遞額外參數(shù)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于Vue+ECharts實(shí)現(xiàn)地圖展示與交互

    基于Vue+ECharts實(shí)現(xiàn)地圖展示與交互

    這篇文章中,我將逐步介紹如何使用 Vue 和 ECharts 實(shí)現(xiàn)一個(gè)互動式的地圖展示組件,其中支持返回上一層地圖、點(diǎn)擊查看不同城市的詳細(xì)信息,以及根據(jù)數(shù)據(jù)動態(tài)展示不同的統(tǒng)計(jì)信息,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02
  • vue中Echarts使用動態(tài)數(shù)據(jù)的兩種實(shí)現(xiàn)方式

    vue中Echarts使用動態(tài)數(shù)據(jù)的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了vue中Echarts使用動態(tài)數(shù)據(jù)的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 解決Vue+ts里面this.$store問題

    解決Vue+ts里面this.$store問題

    這篇文章主要介紹了解決Vue+ts里面this.$store問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue-electron中修改表格內(nèi)容并修改樣式

    vue-electron中修改表格內(nèi)容并修改樣式

    本文主要介紹了vue-electron中修改表格內(nèi)容并修改樣式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評論

曲水县| 丰顺县| 且末县| 集贤县| 上高县| 铜陵市| 乐清市| 伊宁市| 额敏县| 攀枝花市| 普格县| 剑阁县| 江陵县| 资兴市| 成武县| 武宁县| 克山县| 万州区| 平度市| 顺义区| 平塘县| 高青县| 博客| 亳州市| 拜城县| 雷波县| 永济市| 丰城市| 额敏县| 平山县| 扶余县| 宁明县| 南川市| 漯河市| 靖西县| 温宿县| 武威市| 沙湾县| 教育| 承德县| 榆林市|