当前位置:网站首页 > Vue.js开发 > 正文

vue自定义指令

vue自定义指令——Vue.directive、bind()函数、参数binding对象的用法

除了核心功能默认内置的指令 (v-modelv-show),Vue 也允许注册自定义指令。Vue2.0 中,代码复用和抽象的主要形式是组件。

在使用自定义指令时,需要加上 v- 前缀。

自定义指令(官网)——https://cn.vuejs.org/v2/guide/custom-directive.html

自定义指令(菜鸟教程)——https://www.runoob.com/vue2/vue-custom-directive.html

directive 用法源码(注册自定义指令)——https://www.jianshu.com/p/9db

1、基本介绍
1.1、注册全局自定义指令

全局共享的自定义指令需要通过“Vue.directive()”进行声明,示例代码如下:

官网版

// 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { 
    // focus 自定义指令名称 // 当被绑定的元素插入到 DOM 中时 inserted: function (el) { 
    // 聚焦元素 el.focus() } }) 

详细版

Vue.directive('focus', { 
    // focus 自定义指令名称 bind: function(el) { 
    //表示当指令绑定到元素身上时会执行bind函数,只执行一次 //el代表被绑定指令的哪个元素,且函数中的第一个参数都为el.el是一个原生的js对象,里面有些元素的dom方法 // 绑定到元素身上时,数据尚在内存中,无法在页面中显示,所以el.focus()没有效果,而console.log('你好呀')可以显示 el.focus() console.log('你好呀') }, inserted: function(el) { 
    //表示元素插入dom中的时候回执行inserted函数,只触发一次 el.focus() }, updated: function() { 
    //当vNode更新的时候回执行updated函数,可以会触发多次 } }) 
1.2、注册局部自定义指令

官网版

// 注册一个局部自定义指令 directives: { 
    focus: { 
    // 指令的定义 inserted: function (el) { 
    el.focus() } } } 

示例

  • 在声明自定义指令时,可以通过形参中的第二个参数binding,来接收指令的参数值。
  • bind 函数只调用 1 次:当指令第一次绑定到元素时调用,当 DOM 更新时 bind 函数不会被触发。
  • update 函数会在每次 DOM 更新时被调用。
directives: { 
    //定义私有指令 // 定义名为 color 的指令,指向一个配置对象 'color': { 
    // 当指令第一次被绑定到元素上的时候,会立即触发 bind 函数 // 形参中的 el 表示当前指令所绑定到的那个 DOM 对象  bind: function(el, binding) { 
    el.style.color = binding.value }, // 在 DOM 更新的时候,会触发 update 函数 update(el, binding) { 
    console.log('触发了 v-color 的 update 函数') el.style.color = binding.value } } } 

如果 bind和update 函数中的逻辑完全相同,则对象格式的自定义指令可以简写成函数格式:

directives: { 
    color(el, binding) { 
    el.style.color = binding.value } } 
1.3、调用方式
  • 在使用自定义指令时,需要加上 v- 前缀。
  • 在 template 结构中使用自定义指令时,可以通过等号(=)的方式,为当前指令动态绑定参数值

示例代码如下:

<input type="text" v-focus v-color="'blue'"> 等价于 <h1 v-color="color">App 根组件</h1> <script> data() { return { color: 'blue' } } </script> 
2、钩子函数

作用——当使用自定义指令时触发的回调函数

2.1、函数种类
函数名称 作用
bind 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
inserted 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
updated 所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新

注意

一般初始化元素属性用bind,使用js的方法,应该用inserted和updated

2.2、函数参数

自定义指令参数

在这里插入图片描述

基本结构

// 自定义指令函数 基本写法 Vue.directive('自定义指令名称', { 
    bind(el, binding, vnode, oldVnode) { 
    console.log("此处为逻辑代码") } }) 
3、完整示例

第一步:定义自定义指令文件

src/components/common/demo.js

import Vue from 'vue'; // 注册一个全局自定义指令 `v-focus` 自定义指令函数——基本写法 Vue.directive('focus', { 
    // focus 自定义指令名称 bind(el, binding, vnode, oldVnode) { 
    // vnode, oldVnode——定义了,可以不使用 console.log("此处为逻辑代码") } }) 

第二步:在main.js中进行引入

src/main.js

// 全局使用 自定义指令 import '@/components/common/dialogDrag.js'; 

第三步:在页面中进行使用

index.vue

<input type="text" v-focus> 
到此这篇vue自定义指令的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • VUE中,el-select选择器多选下拉框实现全选功能和取消全选2024-11-30 17:45:05
  • vue中使用图像编辑器tui-image-editor(三)——示例之详细注释和组件化.md2024-11-30 17:45:05
  • vue3中,封装dialog组件,实现页面级一级弹框、二级弹框和三级弹框(一)——一级弹框 & 封装关闭按钮 & 全局定义和引入公共样式 & 页面@import引入自定义样式2024-11-30 17:45:05
  • vue3中,封装dialog组件,实现页面级一级弹框、二级弹框和三级弹框(二)——二级弹框2024-11-30 17:45:05
  • vue3中,封装dialog组件,实现页面级一级弹框、二级弹框和三级弹框(三)——三级弹框2024-11-30 17:45:05
  • vue中配置axios教程-定稿版(一)——api index.js配置文件和.env文件2024-11-30 17:45:05
  • 配置项目(一)——vue.config.js2024-11-30 17:45:05
  • vue中配置axios教程-定稿版(三)——页面index.vue中引入和使用接口文件,network查看请求和响应2024-11-30 17:45:05
  • vue项目路由跳转后上一页面未完成的接口取消2024-11-30 17:45:05
  • vue-template-admin的keep-alive缓存与移除缓存2024-11-30 17:45:05
  • 全屏图片