一、什么是自定义指令

我们已经熟悉Vue内置的一系列指令 ,比如 v-model, v-show, v-if, v-for等等,自定义指令从命名上看主要区别于Vue自带的内置指令,我们可以创建自己想要的指令,使用必须以v-为前缀

二、指令的分类

  • 局部指令:组件中通过directives选项实现,只能在当前组件中使用
  • 全局指令:应用实例的directive方法,可以在任意组件中被使用(所有内置指令都为全局指令)

三、指令的作用

  • 代码重用
  • 处理普通元素的底层 DOM 访问的逻辑

四、指令的钩子

指令的钩子和组件的生命周期很像,只是没有beforeCreate

const myDirective = {// 在绑定元素的 attribute 前// 或事件监听器应用前调用created(el, binding, vnode, prevVnode) {// 下面会介绍各个参数的细节},// 在元素被插入到 DOM 前调用beforeMount() {},// 在绑定元素的父组件// 及他自己的所有子节点都挂载完成后调用mounted() {},// 绑定元素的父组件更新前调用beforeUpdate() {},// 在绑定元素的父组件// 及他自己的所有子节点都更新后调用updated() {},// 绑定元素的父组件卸载前调用beforeUnmount() {},// 绑定元素的父组件卸载后调用unmounted() {}
}

五、钩子参数

指令的钩子会传递以下几种参数:

  • el:指令绑定到的元素。这可以用于直接操作 DOM。

  • binding:一个对象,包含以下 property:

    • value:传递给指令的值。例如在 v-my-directive=“1 + 1” 中,值是 2。
    • oldValue:之前的值,仅在 beforeUpdate 和 updated 中可用。无论值是否更改,它都可用。
    • arg:传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中,参数是 “foo”。
    • modifiers:一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中,修饰符对象是 { foo: true, bar: true }。
    • instance:使用该指令的组件实例。
    • dir:指令的定义对象。
  • vnode:代表绑定元素的底层 VNode。

  • prevNode:之前的渲染中代表指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。

六、指令的使用

简单需求: 当某个元素挂载完成后可以自动获取焦点

默认的实现方式,假如有多个地方需要使用时,这种实现方式的代码会显得繁杂冗余

<template><div><input type="text" ref="input" /></div>
</template><script>
import { ref, onMounted } from "vue";export default {setup () {const input = ref(null);onMounted(() => {input.value.focus();})return {input}}
}
</script><style scoped>
</style>

使用自定义指令实现

<template><input type="text" v-focus />
</template>
<script setup>
// 在模板中启用 v-focus
const vFocus = {mounted: (el) => el.focus()
}
</script>

注:在<script setup> 中,任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令,vFocus 即可以在模板中以 v-focus 的形式使用

如果不使用 <script setup>,自定义指令可以通过 directives 选项注册

<template><input type="text" v-focus />
</template>
<script>
export default {setup() {/*...*/},directives: {focus: {mounted: (el) => el.focus()}}
}
</script>

也可以全局注册该指令,这样所有组件都可以使用v-focus

const app = createApp({})// 使 v-focus 在所有组件中都可用
app.directive('focus', {mounted: (el) => el.focus()
})

七、指令的参数和修饰符

假如我们使用这样一个指令v-example

<div v-example:params.lazy="someValue"></div>

此时指令钩子函数的binding 参数会是一个这样的对象:

{arg: 'params',modifiers: { lazy: true },value: /* `someValue` 的值 */,oldValue: /* 上一次更新时 `someValue` 的值 */
}

也就是说指令:后面跟着的是指令的参数,.后面跟着的是指令的修饰符

简单示例一:

背景高亮

<template><div><div v-highlight>默认的高亮颜色</div><div v-highlight="{ bgColor: 'red', color: 'yellow' }">这是一个简单的例子</div></div>
</template>
<script>
export default {setup() {/*...*/},directives: {highlight: {mounted(el, binding) {console.log('binding', binding)const color = binding.value && binding.value.color ? binding.value.color : '#fff'const bgColor = binding.value && binding.value.bgColor ? binding.value.bgColor : 'blue'el.style.color = colorel.style.backgroundColor = bgColor}}}
}
</script>


简单示例二:

<template><div><div v-letter:uppercase>hello world</div></div>
</template>
<script>
export default {setup() {/*...*/},directives: {letter: {mounted(el, binding) {const text = el.innerHTMLif (binding.arg === 'uppercase') {el.innerHTML = text.toUpperCase()} else if (binding.arg === 'lowercase') {el.innerHTML = text.toLowerCase()} else {el.innerHTML = text.split('')}}}}
}
</script>

vue3的自定义指令directives相关推荐

  1. 【Vue2】自定义指令 directives 过滤器 filter

    自定义指令 directives directives 的简写 我们可以通过配置项 directives 来自定义指令 自定义指令时直接写指令名 XXX,使用时需要加上前缀为 v-XXX <di ...

  2. 手把手教你在 Vue3 中自定义指令

    TienChin 项目前端是 Vue3,前端有这样的一个需求:有一些前端页面上的按钮要根据用户的权限来决定是否展示出来,如果用户具备相应的权限,那么就展示对应的按钮:如果用户不具备对应的权限,那么按钮 ...

  3. vue 自定义指令 directives

    原文链接: vue 自定义指令 directives 上一篇: vue 事件修饰符 stop,capture,prevent 下一篇: js 坑... vue 可以自己扩充指令 增加一个v-color ...

  4. vue自定义指令directives同时传递多个参数

    vue自定义指令directives同时传递多个参数 // 自定义指令v-hClick绑定for循环第二个参数,这里的inx还可以是其他标的,指令中可通过其做出判断 在dom,将多个参数通过数组的格式 ...

  5. vue自定义指令directives实现自动点击事件及自动点击第一个按钮

    业务场景:点击弹窗默认加载第一个按钮的数据.vue自定义指令directives实现这个需求 目录 自动点击所有的按钮. 自动点击第一个按钮, 自动点击所有的按钮. <ul class=&quo ...

  6. Vue2自定义指令directives简介

    我们在学习vue的时候会学习多个指令,如v-show,v-text,v-pre等等.但如果我们想要完成一些现有指令无法完成的操作的时候,就应该使用自定义指令来实现我们想要的操作.所以现在我们就来简单讲 ...

  7. Vue.js中的自定义指令directives

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.自定义指令,需要声明钩子函数.注册自定义指令也分为注册全局自定义指令和注册局部自定义指令.两者用法相同, ...

  8. Vue3:自定义指令directive

    一.vue2自定义指令生命周期 bind: function () {}, inserted: function () {}, update: function () {}, componentUpd ...

  9. 手把手带你写一个 Vue3 的自定义指令

    背景 众所周知,Vue.js 的核心思想是数据驱动 + 组件化,通常我们开发页面的过程就是在编写一些组件,并且通过修改数据的方式来驱动组件的重新渲染.在这个过程中,我们不需要去手动操作 DOM. 然而 ...

最新文章

  1. mysql删除有关联的数据库表_【数据库】mysql如何删除关联表
  2. ps -ef和ps aux
  3. 文案月薪3w?月薪10w的设计大神笑而不语
  4. 经典解释监视器和对象锁
  5. 观点:比特币新一轮突破“即将到来”
  6. (WCF)阅读WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解的一点心得...
  7. NFS PRC端口映射器
  8. 深大uooc大学生心理健康章节答案第九章
  9. PowerDesigner下载安装教程
  10. Mac电脑怎么使用ping命令
  11. elasticsearch实践之代码结构设计
  12. 计算机程序是指为解决某一问题,在计算机中为解决某一特定问题二设计的指令程序是...
  13. fastadmin 多表关联查询
  14. 他 1 个月写了个操作系统,退休后去做飞行员!
  15. 吞噬星空java_(完)Java基础练习题:题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 - 菜鸟头头...
  16. 通话质量好的蓝牙耳机有哪些?通话质量好的蓝牙耳机盘点
  17. KubernetesDatabase-k8s中helm方式安装postgresql及pgadmin
  18. ​势头强劲的 Python PK 强大的 C++,究竟谁更胜一筹?
  19. nodejs+Vue网上图书购物销售_旧书回收系统
  20. 五款轻量型bug管理工具横向测评

热门文章

  1. 装配一台计算机有哪些安全注意事项,挤出机注意事项
  2. Linux文本处理三剑客(awk、grep、sed)
  3. Android中级面筋:开发2年的程序员如何短期突击面试?
  4. OpenCV实践之路——opencv玩数独之一九宫格轮廓提取与透视变换
  5. win10系统,点击连接校园网WLAN后,弹不出登录网页
  6. LocalSend - 文件传输工具
  7. Mysql 5.7 表名大写遇到的坑 error: 1146: Table 'your_table' doesn't exist
  8. 对于大数据的一些处理方法
  9. 如何完整的修改一个数据库的名称
  10. CaptureScreenshot