vue中自定义指令(directive)的基本使用方法

 更新时间:2021年09月23日 10:36:12   作者:丶Serendipity丶  
Vue中内置了很多的指令,但有时候这些指令并不能满足我们,或者说我们想为元素附加一些特别的功能,这时候我们就需要用到vue中一个很强大的功能了—自定义指令,这篇文章主要给大家介绍了关于vue中自定义指令(directive)的基本使用方法,需要的朋友可以参考下

前言

在vue项目中我们经常使用到 v-show ,v-if,v-for等内置的指令,除此之外vue还提供了非常方便的自定义指令,供我们对普通的dom元素进行底层的操作。使我们的日常开发变得更加方便快捷。本文就来总结一下自定义指令的使用方法及常用的场景。

正文

1.全局注册

这里全局注册一个指令,用于使用该指令的元素加一个红色边框,通过指令操作样式。

<div id="app">
    <h1 type="text" v-red>我是h1元素</h1>
    <div v-red>我是div元素</div>
    <p v-red>我是p元素</p><br>
    <input type="text" v-red><br>
  </div>
  <script>
    Vue.directive("red", {
      // 指令的定义
      inserted: function (el) {
        console.log(111);
        el.style.border = "1px solid red"
      }
    })
    new Vue({
      el: "#app",
      data() {
        return {
        }
      },
      methods: {
      }
    })
  </script>

运行结果如下:

上面的代码中通过 Vue.directive 方法注册了一个全局的指令,该函数接收两个参数,第一个参数为指令名称,在元素中通过 " v-名称 " 绑定元素,第二个参数为对绑定元素进行处理的钩子函数,后面会有详细介绍。

2.局部注册

和全局注册指令基本一样,只是作用范围不同而已,这里在组件内部注册一个自定义指令用于给组件内部的绑定元素设置蓝色边框。

<div id="app">
    <border-item></border-item>
  </div>
  <script>
    Vue.directive("red", {
      // 指令的定义
      inserted: function (el) {
        console.log(111);
        el.style.border = "1px solid red"
      }
    })
    // 定义子组件
    Vue.component("border-item", {
      directives: {
        blue: {
          // 指令的定义
          inserted: function (el) {
            el.style.border = "1px solid blue"
          }
        }
      },
      template: `<div>
                    <h1  v-blue>我是子组件h1元素</h1>
                    <div v-blue>我是子组件div元素</div>
                    <p v-blue>我是子组件p元素</p><br>
                    子组件<input type="text" v-blue><br>
                    <p  v-blue>我是子组件h1元素,我同时使用了全局和局部自定义指令</p>
                </div>`
    })
    new Vue({
      el: "#app",
      data() {
        return {
        }
      },
      methods: {
      }
    })
  </script>

运行结果如下:

通过上面的代码,在子组件内部通过 directives 对象注册了一个给绑定元素设置蓝色边框的组件,该对象中传入键值对,其中键表示指令名称,通过" v-名称 "使用,其值对应一个对象,对象内部为指令的相关钩子函数。后面详解钩子函数。

注意:当同一个元素及使用了全局指令和局部指令对统一属性进行操作的时候,会优先使用局部自定义指令,这里采用就近原则,局部指令会优先于全局指令对统一属性操作的调用。

3.钩子函数及参数设置

看了上面的介绍我们值都了directive的用法,但是里面的钩子函数还需要清楚,只有明白了钩子函数的调用时机,才能定义出更加完美的指令。

一个指令定义对象可以提供如下几个钩子函数(均为可选):

* bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

* inserted:被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。

* update:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后      的值来忽略不必要的模板更新(详细的钩子函数参数见下)。

* componentUpdated:指令所在组件的VNode及其子VNode全部更新后调用。

* unbind:只调用一次,指令与元素解绑时调用。

钩子函数参数指令钩子函数会被传入以下参数:  

* el:指令所绑定的元素,可以用来直接操作DOM。  

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

* name:指令名,不包括v-前缀。  

* value:指令的绑定值,例如:v-my-directive="1+1"中,绑定值为2。  

* oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子中可用。无论值是否改变都可用。  

* expression:字符串形式的指令表达式。例如v-my-directive="1+1"中,表达式为"1+1"。  

* arg:传给指令的参数,可选。例如v-my-directive:foo中,参数为"foo"。  

* modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar中,修饰符对象为{foo:true,bar:true}。  

* vnode:Vue编译生成的虚拟节点。  

* oldVnode:上一个虚拟节点,仅在update和componentUpdated钩子中可用。

4.灵活用法

(1)动态指令参数

指令的参数可以是动态的。例如,在v-mydirective:[argument]="value"中,argument参数可以根据组件实例数据进行更新!这使得自定义指令可以在应用中被灵活使用。下面例子中分别设置指令实现元素的边框绑定和元素的背景属性绑定。

<div id="app">
    <h1 v-border="redBorder">我是动态指令参数的元素1</h1>  
    <h1 v-color:[pro]="redBg">我是动态指令参数的元素2</h1>
  </div>
  <script>
    Vue.directive("border", {
      bind: function (el, binding, vnode) {
        console.log("el", el);
        console.log("binding", binding);
        console.log("vnode", vnode);
        el.style.border = binding.value
      }
    })
    Vue.directive("color", {
      bind: function (el, binding, vnode) {
        console.log("el", el);
        console.log("binding", binding);
        console.log("vnode", vnode);
        el.style[binding.arg] = binding.value
      }
    })
    new Vue({
      el: "#app",
      data() {
        return {
          redBorder: "1px solid red",
          pro: "backgroundColor",
          redBg: "green"
        }
      },
      methods: {
      }
    })
  </script>

运行结果如下:

顺便看下打印的参数:

上面的代码中通过两种方式介绍了动态参数自定义指令的方法,使用十分灵活,根据实际需要选择合适的方式。

(2)函数简写方式

在很多时候,你可能想在bind和update时触发相同行为,而不关心其它的钩子。比如这样写:

    Vue.directive("border", 
      function (el, binding, vnode) {
        el.style.border = binding.value
      }
    )

(3)对象字面量方式

在绑定自定义指令的元素红传入一个对象的格式的数据,然后在函数简写方式中使用。

<div id="app">
    <h1 v-color="{ color: 'red', text: 'hello!' }">我是对象字面量形式</h1>
  </div>
  <script>
    // 对象字面量
    Vue.directive('color', function (el, binding) {
      console.log(binding.value.color) // => "red"
      console.log(binding.value.text)  // => "hello!"
      el.style.color = binding.value.color
      el.innerHTML = binding.value.text
    })
    new Vue({
      el: "#app",
      data() {
        return {
        }
      },
      methods: {
      }
    })
  </script>

运行结果如下:

5.使用场景

除了上面的使用场景外,比如我们在项目中通过自定义指令来控制一个前端页面的权限问题,在指令中设置一个参数,当页面加载或者提交事件触发的时候,首先执行该自定义指令的事件,去请求校验是否有这个权限,做出相应的操作。使用的地方还有好多,需要在项目中不断练习,可能有别的替代的方法而不被运用,这就需要我们不断去学习巩固这些基础知识,应用最优的解决方法去完成项目。

写在最后

到此这篇关于vue中自定义指令(directive)的基本使用方法的文章就介绍到这了,更多相关vue自定义指令directive使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue v2.4中新增的$attrs及$listeners属性使用教程

    Vue v2.4中新增的$attrs及$listeners属性使用教程

    这篇文章主要给大家介绍了关于Vue v2.4中新增的$attrs及$listeners属性的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • vue.js 1.x与2.0中js实时监听input值的变化

    vue.js 1.x与2.0中js实时监听input值的变化

    这篇文章主要介绍了vue.js 1.x与vue.js2.0中js实时监听input值的变化的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • vue+element实现图片上传及裁剪功能

    vue+element实现图片上传及裁剪功能

    这篇文章主要为大家详细介绍了vue+element实现图片上传及裁剪功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • vue-router实现简单vue多页切换、嵌套路由、路由跳转的步骤和报错

    vue-router实现简单vue多页切换、嵌套路由、路由跳转的步骤和报错

    最近学习到VUE路由这块,发现这块知识点有点多,好容易混乱,这篇文章主要介绍了vue-router实现简单vue多页切换、嵌套路由、路由跳转的步骤和报错的相关资料,需要的朋友可以参考下
    2024-05-05
  • 详解Vue学习笔记进阶篇之列表过渡及其他

    详解Vue学习笔记进阶篇之列表过渡及其他

    本篇文章主要介绍了详解Vue学习笔记进阶篇之列表过渡及其他,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • vue proxyTable 接口跨域请求调试的示例

    vue proxyTable 接口跨域请求调试的示例

    本篇文章主要介绍了vue proxyTable 接口跨域请求调试的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Vue使用axios图片上传遇到的问题

    Vue使用axios图片上传遇到的问题

    后端写个上传图片的接口可不是很简单,只需要让这个字段限制为图片格式,后台做个保存的逻辑就完事了,前端处理还要牵扯到请求头,数据格式的处理等等问题,按照老传统把图片按照字符串往接口put发现返回的全是400错误,直到我知道了前端的FormData方法!
    2021-05-05
  • Vue中实现父子组件双向数据流的三种方案分享

    Vue中实现父子组件双向数据流的三种方案分享

    通常情况下,父子组件的通信都是单向的,或父组件使用props向子组件传递数据,或子组件使用emit函数向父组件传递数据,本文将尝试讲解Vue中常用的几种双向数据流的使用,需要的朋友可以参考下
    2023-08-08
  • Vue组件之间的数据共享详解

    Vue组件之间的数据共享详解

    这篇文章主要为大家介绍了Vue组件之间的数据共享,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • vue实现导出word文档功能实例(含多张图片)

    vue实现导出word文档功能实例(含多张图片)

    项目需要导出word,于是乎又是查阅资料,然后自己写,下面这篇文章主要给大家介绍了关于vue实现导出word文档功能(含多张图片)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论