浅析vue3项目中自定义指令的运用

 更新时间:2023年08月13日 10:45:22   作者:小五Five  
自定义指令是一种在Vue应用程序中扩展HTML标签的能力,通过自定义指令,我们可以直接在模板中使用指令名,下面我们就来看看项目中具体如何使用自定义指令的吧

一、什么是自定义指令

1. 定义

自定义指令是一种在Vue应用程序中扩展HTML标签的能力。通过自定义指令,我们可以直接在模板中使用指令名,并为其提供相应的逻辑。自定义指令可以用于添加事件监听、修改DOM元素、操作样式等各种场景。

2. 什么时候使用自定义指定

(来自Vue官网)

只有在某些情况下,当需要的功能无法通过内置指令或组件属性来实现时,才应该使用自定义指令。在其他情况下,我们应该尽可能地使用内置指令(例如 v-bind )来声明式地操作模板,这样做更高效,并且对于服务端渲染也更加友好。

当我们需要直接操作DOM元素、引入第三方库或处理特定的浏览器事件时,自定义指令可以提供一种灵活的解决方案。它允许我们以命令式的方式来修改DOM,但也可能导致代码更难维护、测试和理解。

二、Vue3中的自定义指令

1.全局自定义指令

全局自定义指令可以在整个Vue应用程序中使用。

在main.js里面注册:

<!-- main.js -->
import App from './App.vue'
const app = createApp(App)
const focusDirective = directive('focus', {
  mounted(el) {
    el.focus()
  }
})
app.directive('focus', focusDirective)
app.mount('#app')

上面创建了一个名为 focusDirective 的全局自定义指令,它用于将 focus() 方法应用到DOM元素上,从而在渲染后在输入框上设置焦点。然后,我们通过 app.directive('focus', focusDirective) 将该指令添加到Vue应用程序中。

在组件中,我们可以直接使用v-focus指令:

<!-- App.vue -->
<template>
  <div>
    <input v-focus />
  </div>
</template>
<script setup>
// 略去导入模块等逻辑
</script>

2. 组件自定义指令

组件自定义指令是针对特定组件而言的,它只在该组件的范围内生效。任何以  v  开头的驼峰式命名的变量都可以被用作一个自定义指令。所以直接声明即可,vue会自动识别。

<template>
  <div v-change-color></div>
</template>
<script setup>
  const changeColorDirective = {
    mounted(el) {
      el.addEventListener('mouseenter', () => {
        el.style.backgroundColor = 'blue'
      })
      el.addEventListener('mouseleave', () => {
        el.style.backgroundColor = ''
      })
    }
  }
  // 直接声明
  const vChangeColor = changeColorDirective
</script>
<style scoped>
  div {
    width: 100px;
    height: 100px;
    background-color: red;
    box-sizing: border-box;
  }
</style>

三、指令钩子

1. 钩子

一个指令的定义对象可以提供几种钩子函数 (都是可选的):

2. 钩子参数

(来自vue官网)

四、自定义指令的常见用法

自定义指令在项目中有多种常见用法。这里我们介绍两个常见的用例:添加事件监听和操作DOM元素。

1.添加事件监听

自定义指令可以用于添加事件监听,并在触发事件时执行相应的逻辑。例如,我们可以创建一个自定义指令来实现点击按钮时显示一条提示信息:

<template>
  <div>
    <button v-show-message>Click me!</button>
    <p>{{ message }}</p>
  </div>
</template>
<script setup>
import { ref } from 'vue'
const showMessageDirective = {
  mounted(el) {
    el.addEventListener('click', showMessage)
  },
  unmounted(el) {
    el.removeEventListener('click', showMessage)
  }
}
const message = ref('')
const showMessage = () => {
  message.value = 'Button clicked!'
}
</script>

在上述示例中,我们创建了一个名为  vShowMessage 的自定义指令,它在元素上添加了一个点击事件监听器。当按钮被点击时,将触发  showMessage  函数,并更新  message  的值。

2.操作DOM

自定义指令还可以用于直接操作DOM元素,例如修改样式、添加类名等。

比如做项目时常见的情况,使用自定义指令来处理图片加载错误,并显示默认图:

<template>
  <div>
    <img v-error="setFallbackImage" :src="imageSrc" />
  </div>
</template>
<script setup>
import { directive } from 'vue'
const vError = directive('error', {
  mounted(el, binding) {
    el.addEventListener('error', () => {
      binding.value(el)
    })
  },
})
const imageSrc = 'image.jpg'
const setFallbackImage = (el) => {
  el.src = 'fallback.jpg'
}
</script>
<style scoped>
img {
  width: 200px;
  height: 200px;
}
</style>

到此这篇关于浅析vue3项目中自定义指令的运用的文章就介绍到这了,更多相关vue3自定义指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3学习之事件处理详解

    Vue3学习之事件处理详解

    Vue事件处理是每个Vue项目的必要方面。 它用于捕获用户输入,共享数据以及许多其他创造性方式。本文将通过简单的示例为大家讲解了Vue3中事件处理的使用,需要的可以参考一下
    2022-12-12
  • 一文搞懂vue中provide和inject实现原理对抗平庸

    一文搞懂vue中provide和inject实现原理对抗平庸

    这篇文章主要为大家介绍了vue中provide和inject实现原理的深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Vue3 defineProps设置默认值报错问题及解决过程

    Vue3 defineProps设置默认值报错问题及解决过程

    这篇文章主要介绍了Vue3 defineProps设置默认值报错问题及解决过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-08-08
  • Vue3报错computed value is readonly的解决方案

    Vue3报错computed value is readonly的解决方案

    这篇文章主要为大家详细介绍了Vue3报错computed value is readonly的原因排查和解决方法,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2026-03-03
  • Vue图片裁剪功能实现代码

    Vue图片裁剪功能实现代码

    这篇文章主要介绍了Vue图片裁剪功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • vue element-ui里的table中表头与表格出现错位的解决

    vue element-ui里的table中表头与表格出现错位的解决

    这篇文章主要介绍了vue element-ui里的table中表头与表格出现错位的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • :visible.sync 的作用详解

    :visible.sync 的作用详解

    我们在前端开发中经常看到:visible.sync这种修饰符,很多人不知道这是干什么的,在使用ElementUI的时候,里面有个弹窗el-dialog组件的时候会有用到:visible.sync,今天小编带领大家学习下:visible.sync 的作用,感兴趣的朋友一起看看吧
    2022-11-11
  • 关于vue-treeselect绑值、回显等常见问题的总结

    关于vue-treeselect绑值、回显等常见问题的总结

    这篇文章主要介绍了关于vue-treeselect绑值、回显等常见问题的总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue 每次渲染完页面后div的滚动条保持在最底部的方法

    vue 每次渲染完页面后div的滚动条保持在最底部的方法

    下面小编就为大家分享一篇vue 每次渲染完页面后div的滚动条保持在最底部的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 深入浅析Vue中的 computed 和 watch

    深入浅析Vue中的 computed 和 watch

    computed 计算属性是通过属性计算得来的属性,watch属性变化,就会触发监听的函数。下面通过本文给大家介绍Vue中的 computed 和 watch,感兴趣的朋友一起看看吧
    2018-06-06

最新评论