Vue3 学习笔记 —Vue3 自定义指令

开发 前端
自定义指令分为全局和局部两种类型,大家并不陌生。今天我们就讲讲在 vue3 中,自定义指令定义、使用以及钩子函数都有哪些变化?

[[437508]]

自定义指令分为全局和局部两种类型,大家并不陌生。今天我们就讲讲在 vue3 中,自定义指令定义、使用以及钩子函数都有哪些变化?

一、注册自定义指令

以下实例都是实现一个输入框自动获取焦点的自定义指令。

1.1、全局自定义指令

在vue2中,全局自定义指令通过 directive 挂载到 Vue 对象上,使用 Vue.directive('name',opt)。

实例1:Vue2 全局自定义指令

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

 inserted 是钩子函数,在绑定元素插入父节点时执行。

在 vue3 中,vue 实例通过createApp 创建,所以全局自定义指令的挂载方式也改变了, directive 被挂载到 app上。

实例2:Vue3 全局自定义指令

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

1.2、局部自定义指令

在组件内部,使用 directives 引入的叫做局部自定义指令。Vue2 和 Vue3 的自定义指令引入是一模一样的。

实例3:局部自定义指令

<script> 
//局部自定义指令 
const defineDir = { 
 focus:{ 
  mounted(el){ 
   el.focus() 
  } 
 } 

export default { 
 directives:defineDir, 
 setup(){} 

</script> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

二、自定义指令中的生命周期钩子函数

一个指令定义对象可以提供如下几个钩子函数(都是可选的,根据需要引入)

  • created :绑定元素属性或事件监听器被应用之前调用。该指令需要附加需要在普通的 v-on 事件监听器前调用的事件监听器时,这很有用。
  • beforeMounted :当指令第一次绑定到元素并且在挂载父组件之前执行。
  • mounted :绑定元素的父组件被挂载之后调用。
  • beforeUpdate :在更新包含组件的 VNode 之前调用。
  • updated :在包含组件的 VNode 及其子组件的 VNode 更新后调用。
  • beforeUnmounted :在卸载绑定元素的父组件之前调用
  • unmounted :当指令与元素解除绑定且父组件已卸载时,只调用一次。

实例3:测试指令内生命周期函数执行

<template> 
 <div> 
  <input type="text" v-focus  v-if="show"><br> 
  <button @click="changStatus">{{show?'隐藏':'显示'}}</button> 
 </div> 
</template> 
 
//局部自定义指令 
const autoFocus = { 
 focus:{ 
  created(){ 
   console.log('created'); 
  }, 
  beforeMount(){ 
   console.log('beforeMount'); 
  }, 
  mounted(el){ 
   console.log('mounted'); 
  }, 
  beforeUpdated(){ 
   console.log('beforeUpdated'
  }, 
  updated(){ 
   console.log('updated'); 
  }, 
  beforeUnmount(){ 
   console.log('beforeUnmount'); 
  }, 
  unmounted(){ 
   console.log('unmounted'); 
  } 
 }, 

import { ref } from 'vue' 
export default { 
 directives:autoFocus, 
 setup(){ 
  const show = ref(true
  return { 
   show, 
   changStatus(){ 
    show.value = !show.value 
   } 
  } 
 } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.

 通过点击按钮,我们发现创建 input 元素的时候,会触发 created、beforeMount 和 mounted 三个钩子函数。

隐藏 input 元素的时候,会触发 beforeUnmount 和 unmounted 。

然而我们添加的 beforeUpdate 和 updated 函数并没有执行。

此时我们把 input 元素上的 v-if 修改成 v-show 就会执行上述两个方法了,具体的执行情况自行验证下。

从 vue2 升级到 vue3 ,自定义指令的生命周期钩子函数发生了改变,具体变化如下:

  • bind 函数被替换成了beforeMounted。
  • update 被移除。
  • componentUpdated 被替换成了updated。
  • unbind 被替换成了 unmounted。
  • inserted 被移除。

三、自定义指令钩子函数的参数

钩子函数被赋予了以下参数:

  • el:指令所绑定的元素,可以直接操作DOM。
  • binding:是一个对象,包含该指令的所有信息。

binding 包含的属性具体的分别为:

  • arg 自定义指令的参数名。
  • value 自定义指令绑定的值。
  • oldValue 指令绑定的前一个值。
  • dir 被执行的钩子函数
  • modifiers:一个包含修饰符的对象。
<template> 
 <div> 
  <div v-fixed >定位</div> 
 </div> 
</template> 
 
<script> 
//自定义指令动态参数 
const autoFocus = { 
 fixed:{ 
  beforeMount(el,binding){ 
   console.log('el',el) 
   console.log('binding',binding) 
  } 
 } 

export default { 
 directives:autoFocus, 
 setup(){ 
 } 

</script> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

四、自定义指令参数

自定义指令的也可以带参数,参数可以是动态的,参数可以根据组件实例数据进行实时更新。

实例4:自定义指令动态参数

<template> 
 <div> 
  <div v-fixed:pos="posData" style="width:100px;height:100px;background:grey">定位</div> 
 </div> 
</template> 
 
<script> 
//自定义指令动态参数 
const autoFocus = { 
 fixed:{ 
  beforeMount(el,binding){ 
   el.style.position = "fixed" 
   el.style.left = binding.value.left+'px' 
   el.style.top = binding.value.top + 'px' 
  } 
 } 

export default { 
 directives:autoFocus, 
 setup(){ 
  const posData = { 
   left:20, 
   top:200 
  } 
  return { 
   posData, 
  } 
 } 

</script>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

什么时候需要自定义指令?

  • 需要对普通 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自定义指令

2021-11-16 08:50:29

Vue3 插件Vue应用

2023-06-28 08:05:46

场景vue3自定义

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监听数据

2021-11-17 08:24:47

Vue3 插件Vue应用

2023-12-01 09:02:57

Vue3WangEditor

2022-03-10 11:04:04

Vue3Canvas前端

2021-05-26 10:40:28

Vue3TypeScript前端

2023-11-29 08:49:31

Vue.jsData 函数
点赞
收藏

51CTO技术栈公众号