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

Vue3 學(xué)習(xí)筆記 —Vue3 自定義指令

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

[[437508]]

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

一、注冊(cè)自定義指令

以下實(shí)例都是實(shí)現(xiàn)一個(gè)輸入框自動(dòng)獲取焦點(diǎn)的自定義指令。

1.1、全局自定義指令

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

實(shí)例1:Vue2 全局自定義指令

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

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

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

實(shí)例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 的自定義指令引入是一模一樣的。

實(shí)例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ù)

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

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

實(shí)例3:測(cè)試指令內(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.  } 

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

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

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

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

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

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

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

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

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

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

  • arg 自定義指令的參數(shù)名。
  • value 自定義指令綁定的值。
  • oldValue 指令綁定的前一個(gè)值。
  • dir 被執(zhí)行的鉤子函數(shù)
  • modifiers:一個(gè)包含修飾符的對(duì)象。
  1. <template> 
  2.  <div> 
  3.   <div v-fixed >定位</div> 
  4.  </div> 
  5. </template> 
  6.  
  7. <script> 
  8. //自定義指令動(dòng)態(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ù)可以是動(dòng)態(tài)的,參數(shù)可以根據(jù)組件實(shí)例數(shù)據(jù)進(jìn)行實(shí)時(shí)更新。

實(shí)例4:自定義指令動(dòng)態(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. //自定義指令動(dòng)態(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>

什么時(shí)候需要自定義指令?

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

 

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

2021-12-01 08:11:44

Vue3 插件Vue應(yīng)用

2023-11-28 09:03:59

Vue.jsJavaScript

2022-07-26 01:06:18

Vue3自定義指令

2021-11-16 08:50:29

Vue3 插件Vue應(yīng)用

2023-06-28 08:05:46

場(chǎng)景vue3自定義

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2024-09-26 14:16:07

2021-12-29 07:51:21

Vue3 插件Vue應(yīng)用

2021-12-08 09:09:33

Vue 3 Computed Vue2

2022-08-01 11:41:00

Vue插件

2020-09-19 21:15:26

Composition

2023-12-11 07:34:37

Computed計(jì)算屬性Vue3

2023-12-06 07:43:56

Vue如何定義事件

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)聽(tīng)數(shù)據(jù)

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ù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲aⅴ | 中文字幕在线观看第一页 | 亚洲影音先锋 | 成人福利电影 | 欧美日韩一区在线播放 | 红桃成人在线 | 亚洲精品久久久久久下一站 | h在线免费观看 | 亚洲国产精品久久久久 | 久久综合一区 | 91精品国产综合久久久动漫日韩 | 久久高清免费视频 | 中文字幕免费在线 | 亚洲精品大全 | 日本手机在线 | 亚洲人成人一区二区在线观看 | 中文字幕日韩三级 | 国产精品视频一区二区三区不卡 | 亚洲一区二区三区免费视频 | 在线免费激情视频 | 日韩www| 日韩在线观看一区二区三区 | 天堂资源 | 日韩第1页| 欧美亚洲成人网 | 亚洲69p| 怡红院怡春院一级毛片 | 久久精品这里精品 | 午夜影院在线 | 亚洲九色| 国产精品夜夜夜一区二区三区尤 | 国产日韩久久 | 91在线看片 | 91久久精品国产免费一区 | 免费欧美| 日韩一级免费电影 | 91av亚洲| 1区2区视频 | 国产免费又色又爽又黄在线观看 | 日韩精品免费看 | 99视频在线免费观看 |