vue.js 创建自定义指令小抄

逻辑摆渡人
• 阅读 3241

指令允许当它的值改变时对元素应用任何DOM操作。比如我们做一个指令v-hidden,当值改变时,更新元素的style值,切换它的可见性。可以这样:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
  <button @click="f=!f">toggle</button>
  <input v-hidden="f"></input>
</div>
<script>
Vue.directive('hidden', {
  update:function(el,binding){
    el.style.display = binding.value?'none':'inline'
  }
})
new Vue(
  {
    el:'#app',
    data(){
      return{f:false}  
    }
  })
</script>

解释如下:

  1. 通过Vue.directive(name,options)注册一个指令。name为指令名,options为指令选项,其中可以加入钩子函数,比如update。还有更多的钩子函数

  2. 使用指令时,必须在名字前加上前缀v,比如v-hidden

所有的钩子函数都有如下的参数:

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

  2. binding: 一个对象,包含以下属性:

    name: 指令名,不包括v-前缀
    value: 指令的绑定值
    oldValue: 指令绑定的前一个值
    expression: 绑定值的未求值形式
    arg: 传给指令的参数
    modifiers: 包含修饰符的对象。 比如v-my-directive.foo.bar,修饰符对象是{ foo: true, bar: true }。
  3. vnode: Vue 编译生成的虚拟节点

  4. oldVnode: 上一个虚拟节点

更多到钩子函数:

  1. bind: 指令第一次绑定到元素时调用

  2. inserted: 指令所属元素插入父节点时调用

  3. update: 指令所属元素绑定值变化是更新

  4. componentUpdated: 被绑定元素所在模板完成一次更新周期时调用

  5. unbind: 指令与元素解绑时调用

指令可局部化注册到特定组件上,只要在组件内使用:

directives: {
  focus: {
    // 指令的定义
  }
}

还是以v-hidden为例:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
  <comp></comp>
</div>
<script>
Vue.directive('hidden', {
  update:function(el,binding){
    el.style.display = binding.value?'none':'inline'
  }
})

Vue.component('comp', {
  template:'<div><button @click="hate=!hate">toggle</button><div v-hidd="hate">{{msg}}</div></div>',
  directives:{
    hidd:{
       update:function(el,binding){
         console.log(binding.value)
          el.style.display = binding.value?'none':'block'
        }
    }
  },
  data(){
    return{hate:false,msg:1}
  }
})

new Vue(
  {
    el:'#app',
    data(){
      return{f:false}  
    }
  })
</script>
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
Volatile关键字
Volatile关键字①volatile的两个特点1保证线程(CPU)之间的可见性;(也就是保证数据一致性)简单解释一下:一个线程将一个值的数值改变时,另一个使用该数值的线程能看到这种改变;2禁止指令重排序(禁止乱序执行);这个和单例
Souleigh ✨ Souleigh ✨
4年前
10分钟学会python函数式编程
在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程。你也将了解列表推导和其它形式的推导。函数范式在命令式范式中,通过为计算机提供一系列指令然后执行它们来完成任务。在执行这些指令时,可以改变某些状态。例如,假设你最初将A设置为5,然后更改A的值。这时在变量内部值的意义上,你改变了A的状态。在函数式范式中,你不用告诉计算机做什
Wesley13 Wesley13
3年前
02、Vue.js
1、插值    在Vue.js指令学习之前,先简单学习一下Vue插值    语法:_{{}}_,将vue实例中的数据写入到页面对应的位置。下面代码中hello、msg、num等均是在vue的data中定义的变量。1.1文本插值<div{{hello}}<div1.2HTML标签插
Wesley13 Wesley13
3年前
PIC中档单片机汇编指令详解(5)
位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指
Stella981 Stella981
3年前
AngularJS 常用指令
AngularJS指令AngularJS有一套完整的、可扩展的、用来帮助web应用开发的指令集,它使得HTML可以转变成“特定领域语言(DSL)”,是用来扩展浏览器能力的技术之一,在DOM编译期间,和HTML关联着的指令会被检测到,并且被执行,这使得指令可以为DOM指定行为,或者改变它。AngularJS指令带有前
Wesley13 Wesley13
3年前
Java并发机制底层实现原理
锁的膨胀过程预备知识CAS硬件对并发的支持在大多数处理器架构(包括IA32和Sparc)中采用的方法是实现一个比较并交换(CAS)指令,CAS包含了3个操作数——内存位置(V),预期原值(A),拟写入的新值(B),当且仅当VA时,CAS才会通过原子方式用新值(B)来更新(V)原有的值,无论操作成
Wesley13 Wesley13
3年前
MongoDB学习系列11:MongoDB中的修改器
使用修改器时,"\_id"的值不能改变,而整个文档在替换时是可以改变"\_id"的。$set用来修改一个键的值。$unset用来删除一个键。$inc用来增加已有键的值,或者在键不存在时创建一个键。只能用于整数、长整数、或者双精度浮点数。$push往数组里添加东西,$pop从数组中删除元素。{$pop:{key:1}}从数据末
Wesley13 Wesley13
3年前
JSP动作元素
JSP动作元素JSP动作元素用来控制JSP容器的动作,可以动态插入文件、重用JavaBean组件、导向另一个页面等。动作元素与指令元素不同,动作元素是在客户端请求时动态执行的,每次有客户端请求时可能都会被执行一次,而指令元素是在编译时被编译执行,它只会被编译一次。可用的标准动作元素如下:1<jsp:useBea
Wesley13 Wesley13
3年前
CAS机制与自旋锁
CAS(CompareandSwap),即比较并替换,java并发包中许多Atomic的类的底层原理都是CAS。它的功能是判断内存中某个地址的值是否为预期值,如果是就改变成新值,整个过程具有原子性。具体体现于sun.misc.Unsafe类中的native方法,调用这些native方法,JVM会帮我们实现汇编指令,这些指令是CPU的原子指令,因此
Stella981 Stella981
3年前
Angular 学习系列
在组合这些ng指令写到一篇文章里的时候,基本是有规则的,本兽会将功能相似相近的一类整合到一篇文章,方便理解和记忆。这篇的三个指令也都是对DOM元素的操作,页面上显示/隐藏的判断,添加/移除的判断。ngIfngIf指令会根据指定的表达式返回的boolean类型值对该元素做添加到/移除出Dom树的操作。格式:ngif“valu
Stella981 Stella981
3年前
Angular @HostBinding()和@HostListener()用法
@HostBinding()和@HostListener()在自定义指令时非常有用。@HostBinding()可以为指令的宿主元素添加类、样式、属性等,而@HostListener()可以监听宿主元素上的事件。@HostBinding()和@HostListener()不仅仅用在自定义指令,只是在自定义指令中用的较多本文基于Angular2