Vue入门到放弃12(自定义指令)

Vue自定义指令

语法:

 Vue.directive('focus', {
      bind: function (el) {},
      inserted: function (el) {},
      updated: function (el) { }
    })

注意: Vue中所有的指令,在调用的时候,都以 v- 开头

 使用  Vue.directive() 定义全局的指令  v-focus

// 其中:参数1 : 指令的名称,注意,在定义的时候,指令的名称前面,不需要加 v- 前缀, 

 // 但是: 在调用的时候,必须 在指令名称前 加上 v- 前缀来进行调用

 //  参数2: 是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作

1.效果实现
定义全局指令:v-focus

// 定义全局的指令  v-focus
// 使用  Vue.directive() 定义全局的指令  v-focus
    // 其中:参数1 : 指令的名称,注意,在定义的时候,指令的名称前面,不需要加 v- 前缀, 
    // 但是: 在调用的时候,必须 在指令名称前 加上 v- 前缀来进行调用
    //  参数2: 是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
    Vue.directive('focus', {
      bind: function (el) { // 每当指令绑定到元素上的时候,会立即执行这个 bind 函数,只执行一次
        // 注意: 在每个 函数中,第一个参数,永远是 el ,表示 被绑定了指令的那个元素,这个 el 参数,是一个原生的JS对象
        // 在元素 刚绑定了指令的时候,还没有 插入到 DOM中去,这时候,调用 focus 方法没有作用
        //  因为,一个元素,只有插入DOM之后,才能获取焦点
        // el.focus()
      },
      inserted: function (el) {  // inserted 表示元素 插入到DOM中的时候,会执行 inserted 函数【触发1次】
        el.focus()
        // 和JS行为有关的操作,最好在 inserted 中去执行,放置 JS行为不生效
      },
      updated: function (el) {  // 当VNode更新的时候,会执行 updated, 可能会触发多次

      }
    })

使用v-focus指令

å¨è¿éæå¥å¾çæè¿°

效果

å¨è¿éæå¥å¾çæè¿°

  我们可以看到刷新后搜索框获取到了焦点,说明我们创建的v-focus生效了,但是大家肯定也有很多疑问,我们来一一解释下。

指令名称

  Vue中所有的指令,在调用的时候,都以 v- 开头,然后在定义的时候我们不用添加v-前缀。

 Vue.directive('focus', {
      bind: function (el) { },
      inserted: function (el) {},
      updated: function (el) {}
    })

 参数方法
  然后就是我们在定义v-focus指令的时候的第二个参数是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作,那么这几个方法分别是什么含义呢?如下


 方法的参数值

 我们调用的bind方法或者inserted方法的参数值是怎么设置的。
    第一个参数,永远是el ,表示被绑定了指令的那个元素,这个el参数,是一个原生的JS对象
    第二个参数,binding:一个对象,包含以下属性

什么场景下调用什么方法

  上面介绍的各个方法在什么场景下调用呢?记住如下原则即可。

  • 和样式相关的操作,一般都可以在 bind 执行
  • 和JS行为有关的操作,最好在 inserted 中去执行

小案例

添加一个设置颜色属性的指令v-color

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿° 效果:

å¨è¿éæå¥å¾çæè¿°

传参使用
  我们系统指令能够动态的接收数据来改变

  <input type="text" v-model="keywords" id="search" v-focus v-color="'green'">

Vue.directive('color', {
      // 样式,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了一个内联的样式
      // 将来元素肯定会显示到页面中,这时候,浏览器的渲染引擎必然会解析样式,应用给这个元素
      bind: function (el, binding) {
        // el.style.color = 'red'
        // console.log(binding.name)
        // 和样式相关的操作,一般都可以在 bind 执行

        // console.log(binding.value)
        // console.log(binding.expression)

        el.style.color = binding.value
      }
    })

效果:

å¨è¿éæå¥å¾çæè¿°

 

自定义私有指令

  和前面介绍的过滤器一样,全局指令其他的vm对象都可以共享,我们也可以为每个vm对象创建私有的指令,如下

  <h3 v-color="'pink'" v-fontweight="900" v-fontsize="50">{{ dt | dateFormat }}</h3>

directives: { // 自定义私有指令
        'fontweight': { // 设置字体粗细的
          bind: function (el, binding) {
            el.style.fontWeight = binding.value
          }
        },
//函数简写
//在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。
        'fontsize': function (el, binding) { // 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去
          el.style.fontSize = parseInt(binding.value) + 'px'
        }
      }

 

效果:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章