• 关于vue指令(directive)


    1.指令的注册

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

    Vue.directive('dirName',function(){

      //定义指令

    });

    另外一种是局部注册:

    new Vue({

      directives:{

        dirName:{

          //定义指令

        }

      }

    });

    2.指令的定义

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

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

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

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

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

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

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

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


    <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]:{}。

    最后附上自己写的一个vue小程序,简单的页面切换,使用vue-cli构建,sample的简单版,还使用的mint-ui组件库,git地址:https://github.com/Stevenzwzhai/news-vue

  • 相关阅读:
    【19】网站搭建:标签功能
    【18】网站搭建:自定义用户模型
    【17】网站搭建:Celery定时刷新缓存
    【16】网站搭建:Redis缓存提速
    【15】网站搭建:用户注册登录
    【14】网站搭建:xadmin后台强化
    【13】网站搭建:全文搜索
    C#,一种简单的方式实现滚动鼠标缩放图片,平移
    WebGIS的开发方式
    C#中找不到MouseWheel事件的解决办法
  • 原文地址:https://www.cnblogs.com/Upton/p/6014866.html
Copyright © 2020-2023  润新知