2020-08-31 Vue 自定义指令

自定义指令

    1. 语法
//全局指令
    Vue.directive('指令名字',{
        //钩子函数(不同时期自动调用)
        bind(el,binding){
            //el 是绑定元素(dom对象)
            //binding 是对象 name 是指令名字 value 使用指令传的参数
            // 只触发一次
        },
        inserted(el,binding){
             //el 是绑定元素(dom对象)
            //binding 是对象 name 是指令名字 value 使用指令传的参数
            // 当前元素 插入到 父节点中 触发
        }
    })


let Home = {
        template:{},
        data(){
            return{}
        },
        directives:{
            "指令名":{
                bind(el,binding){
                    //el 是绑定元素(dom对象)
                    //binding 是对象 name 是指令名字 value 使用指令传的参数
                    // 只触发一次
                },
                inserted(el,binding){
                    //el 是绑定元素(dom对象)
                    //binding 是对象 name 是指令名字 value 使用指令传的参数
                    // 当前元素 插入到 父节点中 触发
                }
            }
        }
    }
    1. 自动获取焦点的小案例
<body>
  <div id="app">
    <input type="text" v-focus="100">
  </div>
</body>
<script src="./js/vue.js"></script>
<script>

  //定义一个指令全局,自动获取焦点
  Vue.directive('focus',{
    inserted(el,binding){
      //el代指使用该指令的元素
      el.focus();
      //binding 传入的一些数据
    }
  })

  let vm = new Vue({
    el:'#app',
    data:{

    }
  })
</script>
    1. 回到顶部的小案例
  <style>
    body {
      height: 2500px;
    }
    button {
      display: block;
      width: 30px;
      height: 120px;
      text-align: center;
      line-height: 30px;
      border-radius: 10px 10px 0px 0px;
      position: fixed;
      bottom: 70px;
      right: 40px;
      display: none;
    }

  </style>
</head>
<body>
  <div id="app">
    <button v-scroll="500">回到顶部</button>
  </div>
</body>
<script src="./js/vue.js"></script>
<script src="./js/jquery.min.js"></script>
<script>

  //定义一个指令全局,回到顶部案例
  Vue.directive('scroll',{
    inserted(el,binding){
      //el代指使用该指令的元素
      
      //binding 传入的一些数据(这里是500)
      let top = binding.value;

      //绑定滚轮事件
      window.onscroll = function(){
        let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        if(scrollTop > top){
          // el.style.display = "block"
          $(el).fadeIn()
        }else {
          $(el).fadeOut()
        }
      }
      //绑定事件回到顶部
      $(el).click(function(){
        window.scrollTo({
          top:0,
          behavior:"smooth"
        })
      })
    },

    //移除事件,提高性能
    unbind(){
      //如果在inserted创建了定时器没清除,或者绑定了全局的事件,需要清除操作
      window.onscroll = null;
    }
  })


  let vm = new Vue({
    el:'#app',
    data:{

    }
  })
</script>

钩子函数

钩子函数
一个指令定义对象可以提供如下几个钩子函数 (均为可选):

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

我们会在稍后讨论渲染函数时介绍更多 VNodes 的细节。

componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

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

接下来我们来看一下钩子函数的参数 (即 el、binding、vnode 和 oldVnode)。

钩子函数参数
指令钩子函数会被传入以下参数:

el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下 property:
      name:指令名,不包括 v- 前缀。
      value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
      oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
      expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
      arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
      modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true,         bar: true }。
      vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
      oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

局部指令定义

//局部自定义指令,和局部组件components类似
  let Home = {
    directives:{
      focus:{
        bind(){

        },
        inserted(el,binding){

        }
      }
    }
  }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容