当前位置:   article > 正文

Vue3 自定义指令_vue3局部自定义指令如何注册

vue3局部自定义指令如何注册

在前端项目中,有很多需求是需要在多页面进行逻辑处理,通常我们所需要的功能可以通过DOM操作来实现,或者多处功能一致,我们就可以使用自定义指令

在vue2中的自定义指令指令注册的方法是

// v-focus.js

import vue from 'vue'

Vue.directive('focus', (el) => {
  el.focus()
})

// main.js
import './utils/v-focus'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

但是在vue3中注册机制已经改变,如果你还是沿用原来的注册方法,指令将未被注册并且抛出异常

废话不多说,让我们来看看vue3是怎么自定义指令

首先官方文档已经说明了如何在setup中以及非setup使用方法

// setup
const vFocus = {
  mounted: (el) => el.focus()
}

// default
export default {
  setup() {
  },
  directives: { // 在模板中启用 v-focus focus: { /* ... */ } }
}

// template
<template> <input v-focus /> </template>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在接下来的全局注册到应用层级,文档就并不是非常的清晰了。

首先要知道,全局注册时需要挂在到根组件#App上,不同于vue2不需要被use使用,vue3的机制是你的指令必须要被注册成方法的,这样你才能全局使用到自定义指令,细看可以知道,use接收一个方法,方法返回参数携带app<HostElement>,我们就可以拿到app去注册全局指令了。

use(plugin: Plugin_2, ...options: any[]): CompatVue;
  • 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JboNzc0S-1664256834054)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f9100787a0b74ca3a73b575a84049435~tplv-k3u1fbpfcp-watermark.image?)]

单文件注册

// v-focus.ts

import type { App } from 'vue'

const install = (Vue: App) => {
  Vue.directive('auto-scroll', (el) => {
    el.focus()
  })
}

export default install

// main.ts
import VFocus from './utils/v-focus'

createApp(App)
  .use(VFocus)
  .mount('#app')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

多文件注册

// index.ts

import type { App } from 'vue'
import vFocus from './v-focus'

const directives = {
    'v-focus': vFocus,
    'XXX': XXX
}
const install = (Vue: App) => {
  Obeject.keys(directives).forEach((key) => {
    Vue.directive(key, directives[key])
  })
}

export default install

// main.ts
import Directives from './utils'

createApp(App)
  .use(Directives)
  .mount('#app')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

最后就可以全局使用了

<template> <input v-focus /> </template>
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/627495
推荐阅读
相关标签
  

闽ICP备14008679号