• VUE2第五天学习---自定义指令


    阅读目录

    1.理解VUE中的自定义指令

    默认核心指令有 (v-model 和 v-show), 但是有时候我们需要用到自定义指令,在vue中,代码复用主要形式和抽象是组件,但是在有的情况下,我们仍然需要对DOM元素进行底层操作,所以这个时候我们需要用到自定义指令。

    比如下面的一个input框,当页面加载时,元素将获得焦点,我们还没有点击input框,input就获得焦点了,如下demo代码:

    <!DOCTYPE html>
    <html>
      <head>
        <title>演示Vue</title>
        <style>
    
        </style>
      </head>
      <body>
        <div id='demo'>
          <input v-focus>
        </div>
      </body>
      <script src="./vue.js"></script>
      <script type="text/javascript">
    
        // 注册一个全局定义指令 v-focus
        Vue.directive('focus', {
    
          // 绑定元素插入到DOM 中
          inserted: function (el) {
            // 聚焦元素
            el.focus()
          }
        })
        new Vue({
          el: '#demo'
        })
      </script>
    </html>

    查看效果

    上面的是全局定义指令 v-foucs, 当然我们也可以局部定义,如下代码:

    <!DOCTYPE html>
    <html>
      <head>
        <title>演示Vue</title>
        <style>
    
        </style>
      </head>
      <body>
        <div id='demo'>
          <input v-focus>
        </div>
      </body>
      <script src="./vue.js"></script>
      <script type="text/javascript">
        new Vue({
          el: '#demo',
          directives: {
            focus: {
              // 指令的定义
              inserted: function (el) {
                // 聚焦元素
                el.focus()
              }
            }
          }
        })
      </script>
    </html>

    查看效果

    然后我们就可以在任何input元素框或者textarea使用 v-focus 了,如下代码:

    <input v-focus />

    2. 指令定义函数提供了如下几个钩子函数(根据VUE教程来):
    bind: 只调用一次,指令第一次绑定到元素时调用,也就是说初始化时候调用一次。
    inserted: 被绑定元素插入父节点时调用(父节点需要存在才会调用)。
    update: 被绑定元素所在的模板更新时调用(通过比较更新前后的绑定值)。
    componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
    unbind: 指令与元素解绑时调用,只调用一次,和bind对应。

    上面几个钩子函数有如下参数 (el, binding, vnode, oldVnode)
    el: 指令所绑定的元素,可用来直接操作DOM。
    binding: {Object} obj有如下属性:
    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编译生成的虚拟节点。
    oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

    注意: 除了 el 之外,其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

    如下demo代码:

    <!DOCTYPE html>
    <html>
      <head>
        <title>演示Vue</title>
        <style>
    
        </style>
      </head>
      <body>
        <div id='demo' v-demo:hello.a.b='message'>
          
        </div>
      </body>
      <script src="./vue.js"></script>
      <script type="text/javascript">
        Vue.directive('demo', {
          bind: function(el, binding, vnode) {
            var s = JSON.stringify;
            el.innerHTML = 
              'name: '       + s(binding.name) + '<br/>' + 
              'value: '      + s(binding.value) + '<br/>' + 
              'expression: ' + s(binding.expression) + '<br/>' + 
              'argument: '   + s(binding.arg) + '<br/>' + 
              'modifiers: '  + s(binding.modifiers) + '<br/>' + 
              'vnode: '      + Object.keys(vnode).join(', ')
          }
        })
        new Vue({
          el: '#demo',
          data: {
            message: 'hello!'
          }
        })
      </script>
    </html>

    查看效果

    对象字面量
    如果指令需要多个值,可以传入一个 JavaScript 对象字面量。
    如下代码:

    <!DOCTYPE html>
    <html>
      <head>
        <title>演示Vue</title>
        <style>
    
        </style>
      </head>
      <body>
        <div id='demo' v-demo="{ color: 'white', text: 'hello!' }">
          
        </div>
      </body>
      <script src="./vue.js"></script>
    
      <script type="text/javascript">
        Vue.directive('demo', function (el, binding) {
          console.log(binding.value.color) // => "white"
          console.log(binding.value.text)  // => "hello!"
        })
        new Vue({
          el: '#demo'
        })
      </script>
    </html>

    查看效果

    在控制台可以看到输出了字符串了。

    2. Vue.js自定义指令的用途。
    上面是教程中的一些demo,但是在实际当中我们需要用到什么地方呢?我们可以预想到可以使用到预加载数据的地方,比如预加载图片,由于图片加载需要一些时间,因此我们先加载一张占位符图片,
    等图片真正加载完成时候,才加载真正的图片,这样的用户体验效果更能更好点。下面是使用vue自定义指令来实现这个功能,代码如下:

    <!DOCTYPE html>
    <html>
      <head>
        <title>演示Vue</title>
        <style>
          img { width: 180px; height: 180px; overflow: hidden;}
        </style>
      </head>
      <body>
        <div id='demo'>
          <img v-for='item in list' v-img='item.url'/>
        </div>
      </body>
      <script src="./vue.js"></script>
    
      <script type="text/javascript">
        Vue.directive('img', {
          inserted: function(el, binding) {
            console.log(el)
            // 下面使用一张背景颜色来演示一下,
            var color = Math.floor(Math.random()*1000000);
            el.style.backgroundColor = '#' + color; // 随机的背景颜色
    
            var img = new Image();
            img.src = binding.value; 
            img.onload = function() {
              el.style.backgroundImage = 'url(' + binding.value + ')';
            }
          }
        });
        new Vue({
          el: '#demo',
          data: {
            list: [
              {
                url: 'http://img.alicdn.com/imgextra/i3/730692984/TB2.dQMdxXkpuFjy0FiXXbUfFXa_!!730692984-0-beehive-scenes.jpg_180x180q70'
              },
              {
                url: 'http://img.alicdn.com/imgextra/i2/730692984/TB239AJdw0kpuFjSspdXXX4YXXa_!!730692984-0-beehive-scenes.jpg_180x180q70'
              },
              {
                url: 'http://img.alicdn.com/imgextra/i4/730692984/TB29TsZdrVkpuFjSspcXXbSMVXa_!!730692984-0-beehive-scenes.jpg_180x180q70'
              }
            ]
          }
        })
      </script>
    </html>

    查看效果

    如上演示可以看到,刚开始载入页面的时候,有那么一瞬间先是背景颜色 最后是图片,这里只是简单的演示一下,在实际使用中,我们可以先放一张预加载的图片,当真正图片加载完成的时候,才显示真正的图片,省的在图片未加载完成的时候,背景图片是空白的效果就不是很好了。

  • 相关阅读:
    Tiling_easy version
    Children’s Queue
    hdu 彼岸
    最小公倍数和最大公约数问题
    hdu 神、上帝以及老天爷
    统计问题
    不容易系列之(3)—— LELE的RPG难题
    hdu 折线分割平面
    hdu Counting Triangles
    Queuing
  • 原文地址:https://www.cnblogs.com/tugenhua0707/p/6828631.html
Copyright © 2020-2023  润新知