大白话Vue2.x-directive

作者: 锋子锅锅 | 来源:发表于2017-07-13 16:21 被阅读0次

除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。

官方建议directive是对纯 DOM 元素进行底层操作使用,一般情况下还是建议使用组件的复用。

directive的意义

自定义指令是用来操作DOM的。

尽管数据驱动是Vue的核心之一,但是在实际情况下,并不是所有的情况都可以用数据来驱动视图,我们不可避免的会在有些情况下有操作DOM的需求,所以directive也就出现了。自定义指令就是一种有效的补充和扩展,不仅可用于定义任何的DOM操作,并且是可复用的。

官方栗子

code

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

//局部指令
directive: {
  focus(el){
    el.focus()
  }
}

use

<input v-focus>
//input标签自动获得标签

是不是感觉很简单?相信自己,其实vue大法真心不难,难得是如何应用。下面先来简单看看的钩子函数。

钩子函数

  • bind:在该元素绑定指令时调用且仅调用一次,用于初始化
  • inserted:元素插入父节点时调用(可能仍在虚拟Dom中)
  • update:模板更新时调用
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

钩子参数

  • el: 指令所绑定的元素,可以用来直接操作 DOM 。
  • binding: 一个对象,包含以下属性:
    • name: 指令名,不包括 v- 前缀。
    • value: 指令的绑定值
    • oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
    • arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
    • modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

实际应用

directive的语法就这么简单,在合适的钩子中做应该做的事就可以了。下面会列出两个使用指令的栗子

集成第三方插件

用了一段时间的vue,其实我都没有留意directive具体使用,一般来言真的很少使用到。直到有一次需要集成第三方插件到Vue时才发现,原来directive是集成第三方插件最合适也是最简单的方式。凡是关于第三方的集成,都可以尝试使用directive

import Vue from 'vue'
import hljs from 'highlight.js'
import 'highlight.js/styles/monokai-sublime.css'

Vue.directive('highlight', {
  bind(el){
    hljs.highlightBlock(el);
  },
})

use

<pre>
  <code v-highlight>
     //code here
  </code>
</pre>

如上,我注册了一个全局的指令 highlight。 指令的作用就是高亮代码,当元素带上'v-highlight'时,hljs就会去初始化该Dom。

当然我这是可以使用组件来实现这个功能,但绝对没有指令那么方便快捷,下面是一个简略的组件,可以看出,不仅定义和使用都比指令来的复杂。

<template>
    <pre>
        <code ref="code">
          <slot name="code"></slot>
        </code>
    </pre>
</template>
<script>
    import hljs from 'highlight.js'
    import 'highlight.js/styles/monokai-sublime.css'
    export default {
        mounted(){
          hljs.highlightBlock(this.$refs.code);
        }
    }
</script>

指令验证

如果需要一个可以复用的验证,我们也可以使指令来完成,下面来看一个简单的栗子:

Vue.directive('checkName', {
  //监控数据变化  
  update(el, binding){
      let regex = /^[a-zA-z]{6,10}$/g;
      //=value === oldValue, 避免重复更新
      if(binding.value !== binding.oldValue){
          el.style.border = regex.test(binding.value) ? '' : '1px solid red';
      }
  }
})

user

<input v-model='value1' v-checkName='value1'></input>
<input v-model='value2' v-checkName='value2'></input>
<input v-model='value3' v-checkName='value3'></input>
<input v-model='value4' v-checkName='value4'></input>

//当value的值不是6-10的字母的时,input的boder变为红色;

result


result

结果很明显,不符合规则的数据,input的边框变红了。

End

这里只是抄写下官方的文档,举两个栗子,就是那么简单,任性 ( ̄~ ̄) !其实主要想说明白的一件事就是明确dirctive的意义:指令是用来操作DOM的,希望能起到抛砖引玉的作用吧。

参考

VUE-自定义指令

原文链接-疯子的博客

相关文章

  • 大白话Vue2.x-directive

    除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2....

  • 大白话Swift入门

    大白话Swift入门大白话Swift入门

  • 服务器部署工具

    大白话 Docker 入门(二) 【阿里云 · 云栖社区】大白话 Docker 入门(二)http://click...

  • 大白话大白话还是大白话

    大白话大白话还是大白话 事情是这么个事情,但是要压住. 这是很常见的情况,生活苦生活烦,但是不要一股脑堆积起来。 ...

  • 大白话讲解Promise(一)

    大白话讲解Promise(一)

  • 2018-08-25

    但是我讲的都是大白话

  • 憾事

    #请勿上升# #大白话古风,通篇大白话# #沉稳冷静将军千×病弱美人凯# #很短,非常短# 00 他这一生最为遗憾...

  • 读书笔记|《大师是怎样炼成的》

    何为大师?1、大白话。大师或者专家要能说大白话,把晦涩难懂的话用人话说出来,说给老人听,说给孩子听,都能听懂才是真...

  • 大白话

    我以前写一段文字,需要思考并且酝酿很久,用优美的语句表达我的见解。含蓄、明朗、潜意识表达我的情感。通常写完后脑壳疼...

  • 大白话

    没有经历过绝望,不会明白星星点点的希望是多么珍贵!没有饿过肚子,不会知道即使馒头咸菜也可以那么可口,没有经历过严冬...

网友评论

    本文标题:大白话Vue2.x-directive

    本文链接:https://www.haomeiwen.com/subject/bmawhxtx.html