自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Vue3 學(xué)習(xí)筆記—Vue3 setup() 高級(jí)用法

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

[[437729]]

從 vue2 升級(jí)到 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),會(huì)有 data、methods、mounted、computed、watch 等等用來定義屬性和方法,共同來處理頁面邏輯,我們把這種方式稱為 Options API。

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

  1. <template> 
  2.  <div> 
  3.   <button @click="add">+</button> 
  4.    {{num}} 
  5.   <button @click="reduce">-</button> 
  6.  </div> 
  7. </template> 
  8. <script> 
  9. export default { 
  10.  data(){ 
  11.   return { 
  12.    num:0 
  13.   } 
  14.  }, 
  15.  methods:{ 
  16.   add(){ 
  17.    this.num++ 
  18.   }, 
  19.   reduce(){ 
  20.    this.num-- 
  21.   } 
  22.  } 
  23. </script> 

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

Vue3 的 Composition API 就是組合式api。

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

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

  1. <template> 
  2.  <div> 
  3.   <button @click="add">+</button> 
  4.    {{num}} 
  5.   <button @click="reduce">-</button> 
  6.  </div> 
  7. </template> 
  8. <script> 
  9.  import { ref } from 'vue' 
  10.  export default
  11.   setup(){ 
  12.    const num = ref(1) 
  13.    return
  14.     num, 
  15.     add(){ 
  16.      num.value++ 
  17.     }, 
  18.     reduce(){ 
  19.      num.value-- 
  20.    } 
  21.   } 
  22.  } 
  23. </script> 

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

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

vue3 學(xué)習(xí)筆記 (四)——vue3 setup() 高級(jí)用法

二、setup 具體怎么用?

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

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

  1. <script> 
  2.  export default
  3.   created(){ 
  4.    console.log('created'); 
  5.   }, 
  6.   setup(){ 
  7.    console.log('setup'); 
  8.   } 
  9.  } 
  10. </script> 

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

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

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

  1. <template> 
  2.  {{a}} 
  3. </template> 
  4. <script> 
  5.  export default
  6.   setup(){ 
  7.    const a = 0 
  8.   } 
  9.  } 
  10. </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:

  1. <script> 
  2.  export default
  3.   setup(){ 
  4.    const a = 0 
  5.    return
  6.     a 
  7.    } 
  8.   } 
  9.  } 
  10. </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:

  1. export default
  2.  setup(){ 
  3.   console.log('setup'); 
  4.  }, 
  5.  mounted(){ 
  6.   console.log('mounted'); 
  7.  } 

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

示例5:

  1. import { onMounted } from "vue"
  2. export default
  3.  setup(){ 
  4.   const a = 0 
  5.   return
  6.    a 
  7.   }, 
  8.   onMounted(()=>{ 
  9.    console.log("執(zhí)行"); 
  10.  }) 
  11.  } 

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

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

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

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

示例6:

  1. <template> 
  2.  <button @click="log">點(diǎn)我</button> 
  3. </template> 
  4. <script> 
  5. export default
  6.  setup(){ 
  7.   const a = 0 
  8.   return
  9.    a 
  10.   } 
  11.  }, 
  12.  methods:{ 
  13.   log(){ 
  14.    console.log( this.$options.setup() );//返回一個(gè)對(duì)象 
  15.   } 
  16.  } 
  17. </script> 

this.$options.setup() 返回的是一個(gè)大對(duì)象,該對(duì)象內(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í),自動(dòng)更新。

示例7:

  1. export default
  2.  props: { 
  3.   msg: String, 
  4.   ans: String, 
  5.  }, 
  6.  setup(props,context){ 
  7.   console.log(props);//Proxy {msg: "著急找對(duì)象", ans: "你有對(duì)象嗎?"
  8.  }, 

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

  1. import { toRefs } from "vue"
  2.  export default
  3.   props: { 
  4.    msg: String, 
  5.    ans: String, 
  6.   }, 
  7.   setup(props,context){ 
  8.    console.log(props); 
  9.    const { msg,ans } = toRefs(props) 
  10.    console.log(msg.value); //著急找對(duì)象 
  11.    console.log(ans.value); //你有對(duì)象嗎? 
  12.   }, 
  13.  } 

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

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

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

3.2、context

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

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

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

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

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

示例9:

  1. <template> 
  2.  <div :style="attrs.style"
  3.   <slot></slot>   
  4.   <slot name="hh"></slot> 
  5.   <button @click="emit('getVal','傳遞值')">子向父傳值</button>  
  6.  </div>  
  7. </template> 
  8. <script> 
  9. import { toRefs,toRef } from "vue"
  10. export default
  11.  setup(props,context){ 
  12.   const { attrs,slots,emit } = context 
  13.   // attrs 獲取組件傳遞過來 style 屬性 
  14.  console.log('slots',slots.default());//插槽數(shù)組 
  15.  console.log('插槽屬性',slots.default()[1].props); //獲取插槽的屬性    
  16.  return
  17.   attrs, 
  18.   emit 
  19.    } 
  20.   }, 
  21.  } 
  22. </script> 

四、setup 特性總結(jié)

1、這個(gè)函數(shù)會(huì)在 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ù)。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2021-11-30 08:19:43

Vue3 插件Vue應(yīng)用

2021-12-08 09:09:33

Vue 3 Computed Vue2

2023-11-28 09:03:59

Vue.jsJavaScript

2021-11-16 08:50:29

Vue3 插件Vue應(yīng)用

2021-12-29 07:51:21

Vue3 插件Vue應(yīng)用

2020-09-19 21:15:26

Composition

2023-11-29 08:49:31

Vue.jsData 函數(shù)

2022-02-18 09:39:51

Vue3.0Vue2.0Script Set

2023-12-11 07:34:37

Computed計(jì)算屬性Vue3

2021-12-15 08:23:42

Vue3 插件Vue應(yīng)用

2023-04-27 11:07:24

Setup語法糖Vue3

2021-11-26 05:59:31

Vue3 插件Vue應(yīng)用

2021-11-17 08:24:47

Vue3 插件Vue應(yīng)用

2023-12-14 08:25:14

WatchVue.js監(jiān)聽數(shù)據(jù)

2024-03-12 12:27:00

Vue 3前端開發(fā)

2021-05-26 10:40:28

Vue3TypeScript前端

2022-03-10 11:04:04

Vue3Canvas前端

2024-11-06 10:16:22

2023-12-06 07:43:56

Vue如何定義事件
點(diǎn)贊
收藏

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