博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指令(2):自定义指令
阅读量:6457 次
发布时间:2019-06-23

本文共 2721 字,大约阅读时间需要 9 分钟。

简介

自定义指令就像一个迷你的函数,把你自定义的功能塞进这个迷你函数里,在页面上快速的调用,增加用户体验。

Vue.directive('dyColor',{    bind:function(el){        el.onclick = () => {            el.style.backgroundColor = '#' + Math.random().toString().slice(2,8)        }     }})new Vue({    el: '#app-1'})

Lorem

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Repellat beatae neque, quo, hic molestiae accusamus maxime cupiditate impedit quia labore aspernatur doloribus necessitatibus! Odio, quod eaque consectetur dolor asperiores id.

clipboard.png

上面这个简单示例中,使用Vue.directive('name',hooks)定义一个指令,在页面上加上前缀v-使用。

bind()为一个钩子函数,也有其他几种钩子,在钩子中完成一些自定义功能,钩子上有几个规定的参数,上面el就是一个,钩子及参数后面分析。

钩子函数

总共有五种HookbindinsertedupdatecomponentUpdatedunbind

  • bind: 在指令绑定到元素上时调用。
  • inserted: 在被绑元素插入到父节点时调用一次(父节点是否插入文档无所谓)
  • unbind: 指令与元素解绑时调用一次。

inserted是新版新加的,这个时机发生在bind之后,增加点灵活度,就目前为止没发现有什么用。

  • update:在被绑元素被修改时,修改内容未被插入时调用
  • componentUpdated: 在被绑元素被修改并把修改内容插入后调用

官网这里是外星人写的,看不清,我暂时就这么理解了,这两个也是基于老版本update修改的。把一个时间分成两部分而已。因为el引用的一个是修改前、一个是修改后的内容,还是有点用。

Vue.directive('test', {    bind:function(el){        el.onclick = () => {            el.style.backgroundColor = '#' + Math.random().toString().slice(2,8)        }         $(el).find('#info_update').append('
  • ' + (el.parentNode?'有父元素':'无父元素') +'
  • ' + (el.parentNode?'有父元素':'无父元素') +'' + $(el).find('h3').text() +'') console.log('update') }, componentUpdated: function (el) { $(el).find('#info_update').append('
  • ' + $(el).find('h3').text() +'
  • ') console.log('componentUpdated') }, unbind: function (el) { console.log('unbind') }})new Vue({ el:'#app-2', data:function(){ return { msg:'test directive', show:true } }, methods:{ updateData:function(){ this.msg = 'hello' } }})

    {
    {msg}}

    Lorem ipsum dolor sit amet consectetur, adipisicing elit. Reprehenderit ad aut cupiditate.

    clipboard.png

    插入被绑元素时,可以看到bind阶段的被绑元素没有父元素,而inserted阶段是有的;而update阶段使用的是修改前的数据,componentUpdated阶段是使用后的数据,点击解绑按钮就是移除被绑元素,自然指令也和元素解绑了。

    钩子函数参数

    因为这几个参数,直接导致Vue灵活度*2,就像定义一个组件那样,自定义指令因为参数的开放性会有无限种可能。

    • el:指令所绑定的元素,可以用来直接操作DOM
    • binding:一个对象,包含与指令本身相关的一些属性:

      • name:指令名,不包括v-前缀
      • value:指令的绑定值,如例v-hello = "1 + 1"中,绑定值为2
      • expression:字符串形式的指令表达式。例如v-hello = "1 + 1"中,表达式为"1 + 1"
      • oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子中可用,无论值是否改变都可用
      • arg:传给指令的参数,可选。例如v-hello:message中,参数为"message"
      • modifiers:一个包含修饰符的对象。例如v-hello.foo.bar中,修饰符对象为{foo:true, bar:true}
    • vnode:Vue编译生成的虚拟节点。可以看成el的底层表现,我们就可以通过它进一步去操作被绑元素
    • oldVnode: 修改前的VNODE,仅在update和componentUpdated两个钩子函数中可用

    一个有意义的示例不可能覆盖它们,在这里只能做个观察,后面写插件时尽量使用它们。

    转载地址:http://ivizo.baihongyu.com/

    你可能感兴趣的文章
    Java——设计模式(装饰模式_IO)
    查看>>
    一个简单版的波纹css3动画
    查看>>
    Web安全之Cookie劫持
    查看>>
    关于禁止ViewPager预加载问题【转】
    查看>>
    【iCore4 双核心板_uC/OS-II】例程八:消息邮箱
    查看>>
    Swift 泛型
    查看>>
    WPF自定义控件(四)の自定义控件
    查看>>
    Cocos2d-x中点九图(Scale9Sprite)创建图片按钮
    查看>>
    PC远程调试移动设备
    查看>>
    HDU 4819 Mosaic (二维线段树)
    查看>>
    c# implicit explicit关键字(隐式和显式数据类型转换)
    查看>>
    JdbcUtils针对事务问题作出的第三次修改
    查看>>
    检测代码运行时间(微秒级)
    查看>>
    【转载】数据仓库的基本架构
    查看>>
    更新ADT20后无法创建Android项目
    查看>>
    贴个ALSA例程
    查看>>
    hdu1358
    查看>>
    Leetcode: Word Break
    查看>>
    2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
    查看>>
    图像处理之opencv---mat、cvmat、IplImage之间的转换
    查看>>