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

Vue3 學習筆記 —Vue3 自定義指令

開發(fā) 前端
自定義指令分為全局和局部兩種類型,大家并不陌生。今天我們就講講在 vue3 中,自定義指令定義、使用以及鉤子函數(shù)都有哪些變化?

[[437508]]

自定義指令分為全局和局部兩種類型,大家并不陌生。今天我們就講講在 vue3 中,自定義指令定義、使用以及鉤子函數(shù)都有哪些變化?

一、注冊自定義指令

以下實例都是實現(xiàn)一個輸入框自動獲取焦點的自定義指令。

1.1、全局自定義指令

在vue2中,全局自定義指令通過 directive 掛載到 Vue 對象上,使用 Vue.directive('name',opt)。

實例1:Vue2 全局自定義指令

  1. Vue.directive('focus',{ 
  2.  inserted:(el)=>{ 
  3.   el.focus() 
  4.  } 
  5. }) 

 inserted 是鉤子函數(shù),在綁定元素插入父節(jié)點時執(zhí)行。

在 vue3 中,vue 實例通過createApp 創(chuàng)建,所以全局自定義指令的掛載方式也改變了, directive 被掛載到 app上。

實例2:Vue3 全局自定義指令

  1. //全局自定義指令 
  2. app.directive('focus',{ 
  3.  mounted(el){ 
  4.   el.focus() 
  5.  } 
  6. }) 
  7.  
  8. //組件使用 
  9. <input type="text" v-focus /> 

1.2、局部自定義指令

在組件內(nèi)部,使用 directives 引入的叫做局部自定義指令。Vue2 和 Vue3 的自定義指令引入是一模一樣的。

實例3:局部自定義指令

  1. <script> 
  2. //局部自定義指令 
  3. const defineDir = { 
  4.  focus:{ 
  5.   mounted(el){ 
  6.    el.focus() 
  7.   } 
  8.  } 
  9. export default { 
  10.  directives:defineDir, 
  11.  setup(){} 
  12. </script> 

二、自定義指令中的生命周期鉤子函數(shù)

一個指令定義對象可以提供如下幾個鉤子函數(shù)(都是可選的,根據(jù)需要引入)

  • created :綁定元素屬性或事件監(jiān)聽器被應用之前調(diào)用。該指令需要附加需要在普通的 v-on 事件監(jiān)聽器前調(diào)用的事件監(jiān)聽器時,這很有用。
  • beforeMounted :當指令第一次綁定到元素并且在掛載父組件之前執(zhí)行。
  • mounted :綁定元素的父組件被掛載之后調(diào)用。
  • beforeUpdate :在更新包含組件的 VNode 之前調(diào)用。
  • updated :在包含組件的 VNode 及其子組件的 VNode 更新后調(diào)用。
  • beforeUnmounted :在卸載綁定元素的父組件之前調(diào)用
  • unmounted :當指令與元素解除綁定且父組件已卸載時,只調(diào)用一次。

實例3:測試指令內(nèi)生命周期函數(shù)執(zhí)行

  1. <template> 
  2.  <div> 
  3.   <input type="text" v-focus  v-if="show"><br> 
  4.   <button @click="changStatus">{{show?'隱藏':'顯示'}}</button> 
  5.  </div> 
  6. </template> 
  7.  
  8. //局部自定義指令 
  9. const autoFocus = { 
  10.  focus:{ 
  11.   created(){ 
  12.    console.log('created'); 
  13.   }, 
  14.   beforeMount(){ 
  15.    console.log('beforeMount'); 
  16.   }, 
  17.   mounted(el){ 
  18.    console.log('mounted'); 
  19.   }, 
  20.   beforeUpdated(){ 
  21.    console.log('beforeUpdated'
  22.   }, 
  23.   updated(){ 
  24.    console.log('updated'); 
  25.   }, 
  26.   beforeUnmount(){ 
  27.    console.log('beforeUnmount'); 
  28.   }, 
  29.   unmounted(){ 
  30.    console.log('unmounted'); 
  31.   } 
  32.  }, 
  33. import { ref } from 'vue' 
  34. export default { 
  35.  directives:autoFocus, 
  36.  setup(){ 
  37.   const show = ref(true
  38.   return { 
  39.    show, 
  40.    changStatus(){ 
  41.     show.value = !show.value 
  42.    } 
  43.   } 
  44.  } 

 通過點擊按鈕,我們發(fā)現(xiàn)創(chuàng)建 input 元素的時候,會觸發(fā) created、beforeMount 和 mounted 三個鉤子函數(shù)。

隱藏 input 元素的時候,會觸發(fā) beforeUnmount 和 unmounted 。

然而我們添加的 beforeUpdate 和 updated 函數(shù)并沒有執(zhí)行。

此時我們把 input 元素上的 v-if 修改成 v-show 就會執(zhí)行上述兩個方法了,具體的執(zhí)行情況自行驗證下。

從 vue2 升級到 vue3 ,自定義指令的生命周期鉤子函數(shù)發(fā)生了改變,具體變化如下:

  • bind 函數(shù)被替換成了beforeMounted。
  • update 被移除。
  • componentUpdated 被替換成了updated。
  • unbind 被替換成了 unmounted。
  • inserted 被移除。

三、自定義指令鉤子函數(shù)的參數(shù)

鉤子函數(shù)被賦予了以下參數(shù):

  • el:指令所綁定的元素,可以直接操作DOM。
  • binding:是一個對象,包含該指令的所有信息。

binding 包含的屬性具體的分別為:

  • arg 自定義指令的參數(shù)名。
  • value 自定義指令綁定的值。
  • oldValue 指令綁定的前一個值。
  • dir 被執(zhí)行的鉤子函數(shù)
  • modifiers:一個包含修飾符的對象。
  1. <template> 
  2.  <div> 
  3.   <div v-fixed >定位</div> 
  4.  </div> 
  5. </template> 
  6.  
  7. <script> 
  8. //自定義指令動態(tài)參數(shù) 
  9. const autoFocus = { 
  10.  fixed:{ 
  11.   beforeMount(el,binding){ 
  12.    console.log('el',el) 
  13.    console.log('binding',binding) 
  14.   } 
  15.  } 
  16. export default { 
  17.  directives:autoFocus, 
  18.  setup(){ 
  19.  } 
  20. </script> 

四、自定義指令參數(shù)

自定義指令的也可以帶參數(shù),參數(shù)可以是動態(tài)的,參數(shù)可以根據(jù)組件實例數(shù)據(jù)進行實時更新。

實例4:自定義指令動態(tài)參數(shù)

  1. <template> 
  2.  <div> 
  3.   <div v-fixed:pos="posData" style="width:100px;height:100px;background:grey">定位</div> 
  4.  </div> 
  5. </template> 
  6.  
  7. <script> 
  8. //自定義指令動態(tài)參數(shù) 
  9. const autoFocus = { 
  10.  fixed:{ 
  11.   beforeMount(el,binding){ 
  12.    el.style.position = "fixed" 
  13.    el.style.left = binding.value.left+'px' 
  14.    el.style.top = binding.value.top + 'px' 
  15.   } 
  16.  } 
  17. export default { 
  18.  directives:autoFocus, 
  19.  setup(){ 
  20.   const posData = { 
  21.    left:20, 
  22.    top:200 
  23.   } 
  24.   return { 
  25.    posData, 
  26.   } 
  27.  } 
  28. </script>

什么時候需要自定義指令?

  • 需要對普通 DOM 元素進行底層操作,這時候就會用到自定義指令。
  • 需要將某些功能在指定DOM元素上使用,但對于需要操作大量DOM元素或者大變動時候,推薦使用組件,而不是指令。

 

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

2021-12-01 08:11:44

Vue3 插件Vue應用

2023-11-28 09:03:59

Vue.jsJavaScript

2022-07-26 01:06:18

Vue3自定義指令

2023-06-28 08:05:46

場景vue3自定義

2021-11-16 08:50:29

Vue3 插件Vue應用

2021-12-02 05:50:35

Vue3 插件Vue應用

2024-09-26 14:16:07

2021-12-08 09:09:33

Vue 3 Computed Vue2

2021-12-29 07:51:21

Vue3 插件Vue應用

2022-08-01 11:41:00

Vue插件

2020-09-19 21:15:26

Composition

2023-12-11 07:34:37

Computed計算屬性Vue3

2023-12-06 07:43:56

Vue如何定義事件

2021-11-26 05:59:31

Vue3 插件Vue應用

2023-12-14 08:25:14

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

2021-11-17 08:24:47

Vue3 插件Vue應用

2023-12-01 09:02:57

Vue3WangEditor

2021-05-26 10:40:28

Vue3TypeScript前端

2022-03-10 11:04:04

Vue3Canvas前端

2023-11-29 08:49:31

Vue.jsData 函數(shù)
點贊
收藏

51CTO技術棧公眾號