成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue3 學習筆記—Vue3 setup() 高級用法

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

[[437729]]

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

一、選項式API 和 組合式API 區別

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

vue2 中的 Options API 就是選項式api,一個中文,一個英文,怎么叫都可以。

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

示例1:計數器

  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> 

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

Vue3 的 Composition API 就是組合式api。

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

示例2:計數器

  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 是讓基礎數據類型具備響應式的,下篇文章具體介紹它的用法,需要的同學可以點個關注不迷路!

用一張圖告訴你它們的區別:

vue3 學習筆記 (四)——vue3 setup() 高級用法

二、setup 具體怎么用?

2.1、setup 什么時候執行?

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

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

執行之后,setup 打印結果始終在前邊。

2.2、setup 數據和方法如何使用?

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

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

運行后發現結果異常:

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

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

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

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

2.3、setup 內部有 this 嗎?

自己在 setup 中打印下 this ,返回結果 是undefined 。說明在 setup 內部是不存在 this ,不能掛載 this 相關的東西。

2.4、setup 內鉤子函數如何使用?

vue3 是可以兼容 vue2 的選項式寫法,所以 鉤子函數可以與 setup 并列存在,就相當于 Options API。

示例4:

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

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

示例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("執行"); 
  10.  }) 
  11.  } 

 注冊的這些生命周期鉤子函數只能在 setup 期間同步使用,因為它們依賴全局內部狀態來定位當前組件實例,不在當前組件下調用函數時會拋出錯誤。

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

2.5、setup與鉤子函數關系

setup 與鉤子函數并列時,setup 不能調用生命周期相關函數,但生命周期可以調用 setup 相關的屬性和方法。

示例6:

  1. <template> 
  2.  <button @click="log">點我</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() );//返回一個對象 
  15.   } 
  16.  } 
  17. </script> 

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

三、setup 參數

使用setup 時,它將接收兩個參數:props 和 context 。

3.1、props

第一個參數是 props ,表示父組件給子組件傳值,props 是響應式的,當傳入新的 props 時,自動更新。

示例7:

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

 因為 props 是響應式的,不能使用 ES6 解構,會消除prop的響應特性,此時需要借用 toRefs 解構。示例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); //著急找對象 
  11.    console.log(ans.value); //你有對象嗎? 
  12.   }, 
  13.  } 

 使用組件時,經常會遇到可選參時,有些地方需要傳遞某個值,有些時候不需要,該如何處理呢?

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

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

3.2、context

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

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

 attrs 是一個非響應式對象,主要接收 no-props 屬性,經常用來傳遞一些樣式屬性。

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

setup 內不存在this,所以 emit 用來替換 之前 this.$emit 的,用于子傳父時,自定義事件觸發。

示例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());//插槽數組 
  15.  console.log('插槽屬性',slots.default()[1].props); //獲取插槽的屬性    
  16.  return
  17.   attrs, 
  18.   emit 
  19.    } 
  20.   }, 
  21.  } 
  22. </script> 

四、setup 特性總結

1、這個函數會在 created 之前執行,上述已解釋。

2、setup 內部沒有 this,不能掛載 this 相關的東西。

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

4、setup 內部數據不是響應式的。

5、setup不能調用生命周期相關函數,但生命周期函數可以調用setup內的函數。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-12-02 05:50:35

Vue3 插件Vue應用

2021-11-30 08:19:43

Vue3 插件Vue應用

2023-11-28 09:03:59

Vue.jsJavaScript

2021-12-08 09:09:33

Vue 3 Computed Vue2

2021-11-16 08:50:29

Vue3 插件Vue應用

2021-12-29 07:51:21

Vue3 插件Vue應用

2020-09-19 21:15:26

Composition

2023-11-29 08:49:31

Vue.jsData 函數

2022-02-18 09:39:51

Vue3.0Vue2.0Script Set

2023-12-11 07:34:37

Computed計算屬性Vue3

2021-12-15 08:23:42

Vue3 插件Vue應用

2023-04-27 11:07:24

Setup語法糖Vue3

2021-11-26 05:59:31

Vue3 插件Vue應用

2021-11-17 08:24:47

Vue3 插件Vue應用

2023-12-14 08:25:14

WatchVue.js監聽數據

2024-03-12 12:27:00

Vue 3前端開發

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如何定義事件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线一区二区三区四区 | 欧洲性生活视频 | 国产精品黄色 | 国产精品高清在线 | 久久久91精品国产一区二区三区 | 精品欧美乱码久久久久久1区2区 | 婷婷不卡 | 一级片在线免费看 | 久久久久国产一区二区三区 | 国产成人精品一区二区三区在线 | 久久久性色精品国产免费观看 | 少妇一级淫片aaaaaaaaa | 久久麻豆精品 | 国内自拍第一页 | 国产91在线 | 亚洲 | 久久免费视频在线 | 91影片 | 亚洲精品国产第一综合99久久 | 羞羞视频免费在线 | 在线观看的av | 在线视频 欧美日韩 | 中文字幕欧美日韩 | 瑞克和莫蒂第五季在线观看 | 成人黄色av网址 | www.久久久.com | 啪啪免费 | 91精品国产一区二区在线观看 | 午夜精品一区二区三区在线视频 | 日韩精品久久久 | 成人免费视频播放 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 99在线免费视频 | 日韩福利片 | 久久av在线播放 | 国产精品日韩高清伦字幕搜索 | 成人免费观看视频 | 精品一区久久 | 国产一级片一区二区三区 | 看av在线 | 一区二区三区回区在观看免费视频 | 国产熟熟 |