zoukankan      html  css  js  c++  java
  • 【vue开发】vue指令Vue.directive使用教程

    1.指令的注册

    指令跟组件一样需要注册才能使用,同样有两种方式,一种是全局注册:

    1
    2
    3
    4
    5
    Vue.directive('dirName',function(){
     
      //定义指令
     
    });

    另外一种是局部注册:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    new Vue({
     
      directives:{
     
        dirName:{
     
          //定义指令
     
        }
     
      }
     
    });

    2.指令的定义

    指令定义,官方提供了五个钩子函数来供我们使用,分别代表了一个组件的各个生命周期

    bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

    inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。

    update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。

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

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

    在这里其他几个都好理解,关于模板更新(update)这里,本人的理解是:该指令所在的模板有变化而需要重新渲染的时候,比如当一个输入框的model发生了变化就会触发指令。当然此处说的比较模糊,具体的还有待研究。

    这段代码可以实现关于update的使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <div id="app">
      <input type="text" v-focus="name" v-model="name" :data-name="name">
      <button type="button" @click="name='zw'">click</button>
     
      <!--当点击按钮的时候name改变,继而触发update中的方法-->
    </div>
    <script>
     
      Vue.directive('focus',{
        bind: function(el, binding){
        console.log('bind:',binding.value);
      },
      inserted: function(el, binding){
        console.log('insert:',binding.value);
      },
      update: function(el, binding, vnode, oldVnode){
        el.focus();
        console.log(el.dataset.name);//这里的数据是可以动态绑定的
        console.table({
          name:binding.name,
          value:binding.value,
          oldValue:binding.oldValue,
          expression:binding.expression,
          arg:binding.arg,
          modifiers:binding.modifiers,
          vnode:vnode,
          oldVnode:oldVnode
        });
      },
      componentUpdated: function(el, binding){
        console.log('componentUpdated:',binding.name);
      }
    });
    new Vue({
      el:'#app',
      data:{
        name:'zwzhai'
      }
    });
    </script>

    3.钩子函数的定义

    以下是官方提供的几个参数:

    el: 指令所绑定的元素,可以用来直接操作 DOM 。
    binding: 一个对象,包含以下属性:
    name: 指令名,不包括 v- 前缀。
    value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。
    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 编译生成的虚拟节点,查阅 VNode API 了解更多详情。
    oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

    这几个参数,大家看文档也能理解,就不多说了,关于bingding的几个属性说一下自己的看法,value这个属性,可以传字面量,也可以传单条语句(如上),还可以以变量的形式如<input type="text" v-focus="name" v-model="name">;arg这里可以传一个字符串,因为在value去访问绑定值得时候拿到的不是直接写的那个,也就是说v-focus="name",这个name永远都是一个变量,需要定义赋值,而arg可以直接访问该值,如v-focus:foo,那么在钩子函数中拿到的就是foo这个字符串。

    在vue的指令中是不可以双向数据绑定的,如官方所说:除了 el 之外,其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。这里补充下关于dataset的知识:

    data-  是html5的一个新属性,查了下浏览器支持程度,目前的主流浏览器都是支持的,IE的话要到10以上。具体的使用:在HTML中以属性的方式去写,data-yourname="value",在js中取这个属性就不用使用getAttribute这个方法,而是直接访问,ele.dataset.yourname,在js中你也可以添加和删除,添加:ele.dataset.dessert="yourname",删除:dette ele.dataset.name。此外,这个属性可以用作css选择器:.class[data-name]:{}。

    使用示例:

    组件中使用方法:

    app.vue中注册:

    全局主题变量:

  • 相关阅读:
    DynamicLibrary动态查询需要的一个CS 文件下载
    指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效
    ACCESS的一个相对好用的数据库连接字符串
    ASP.NET 入门 博客园文章 索引篇
    c# 最小化到系统栏,时钟,随机语句,程序发布 读书笔记本 (三)
    poj 2817 WordStack (状态dp)
    hdu 4380 Farmer Greedy (计算几何 2012 MultiUniversity Training Contest 9 )
    hdu 4353 Finding Mine (计算几何 2012 MultiUniversity Training Contest 6 )
    poj 3735 Training little cats (矩阵快速幂)
    hdu 4374 One hundred layer (dp +单调队列 2012 MultiUniversity Training Contest 8 )
  • 原文地址:https://www.cnblogs.com/xiaohuizhang/p/11589800.html
Copyright © 2011-2022 走看看