美文网首页
Vue 自定义指令

Vue 自定义指令

作者: wdapp | 来源:发表于2020-02-17 18:13 被阅读0次

Vue自定义指令

定义

通过directive方法,配合钩子函数及参数定义指令

定义全局自定义指令

// js
  Vue.directive('focus', {
    inserted (el, binding, vnode, oldVnode) {
      el.focus()
      console.log('inserted', el, binding, vnode, oldVnode)
    },
    bind (el, binding, vnode, oldVnode) {
      console.log('bind', el, binding, vnode, oldVnode)
    },
    unbind (el, binding, vnode, oldVnode) {
      console.log('unbind', el, binding, vnode, oldVnode)
    },
    update (el, binding, vnode, oldVnode) {
      console.log('update', el, binding, vnode, oldVnode)
    },
    componentUpdated (el, binding, vnode, oldVnode) {
      console.log('componentUpdated', el, binding, vnode, oldVnode)
    }
  })

定义局部自定义指令

directives: {
      reverse: {
        inserted (el, binding, vnode, oldVnode) {
          console.log('directives inserted', el, binding, vnode, oldVnode)
        },
        bind (el, binding, vnode, oldVnode) {
          console.log('directives bind', el, binding, vnode, oldVnode)
        },
        unbind (el, binding, vnode, oldVnode) {
          console.log('directives unbind', el, binding, vnode, oldVnode)
        },
        update (el, binding, vnode, oldVnode) {
          console.log('directives update', el, binding, vnode, oldVnode)
        },
        componentUpdated (el, binding, vnode, oldVnode) {
          console.log('directives componentUpdated', el, binding, vnode, oldVnode)
          el.value = binding.value.split('').reverse().join('')
        }
      }
    }

自定义指令使用

// html
<input type="text" v-focus.bar="message">

自定义指令 钩子函数 & 参数

  • 通过directive方法,配合钩子函数及参数定义指令

钩子函数

  • inserted: 被绑定元素插入父节点时调用
  • bind: 指令被绑定时调用
  • unbind: 指令解绑时调用,如 $destory()
  • update: 组件更新时调用
  • componentUpdated: 组件更新后完成调用

参数

  • el: HTML元素
  • binding: 自定义组件信息,如:v-focus.bar="message" & v-blur:foo="value"
    • name 自定义指令名称,除v-,如:foucs、blur
    • value 自定义指令值 hello vue !。指令可以接受合法JS表达式。
    • oldValue 上一个值
    • expression 自定义指令表达式,如:message。
    • arg 参数,如foo
    • modifiers 修饰符 bar,返回 {bar: true}
  • vnode: 虚拟节点
  • oldVnode: 上一个虚拟节点,仅在update、componentUpdated中可用

函数简写 & 动态参数指令

一般情况下 bind和update触发行为相同,所以可以简写为同一个回调函数

 Vue.directive('pin', function (el, binding) {
    console.log(binding)
    el.style.position = 'fixed'
    el.style[binding.arg] = binding.value
  })

在模板中使用v-pin指令,使div改变位置

<div v-pin:[dir]="200 + 'px'">
自定义指令
</div>

v-pin的参数dir设置

var app = new Vue({
    el: '#app',
    data: {
      message: 'hello vue !',
      dir: 'left'
    },
    methods: {
      onInput (val) {
        this.message = val
      }
    }
  })

完成代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>自定义指令</title>
  <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
  {{message}}
  <field v-model="message"></field>
  <input type="text" v-focus.bar="message">
  <div v-pin:[dir]="200 + 'px'">
    自定义指令
  </div>
</div>
<script>
  Vue.component('field', {
    props: {
      value: {
        type: String
      }
    },
    // 局部自定义指令
    directives: {
      reverse: {
        inserted (el, binding, vnode, oldVnode) {
          console.log('directives inserted', el, binding, vnode, oldVnode)
        },
        bind (el, binding, vnode, oldVnode) {
          console.log('directives bind', el, binding, vnode, oldVnode)
        },
        unbind (el, binding, vnode, oldVnode) {
          console.log('directives unbind', el, binding, vnode, oldVnode)
        },
        update (el, binding, vnode, oldVnode) {
          console.log('directives update', el, binding, vnode, oldVnode)
        },
        componentUpdated (el, binding, vnode, oldVnode) {
          console.log('directives componentUpdated', el, binding, vnode, oldVnode)
          el.value = binding.value.split('').reverse().join('')
        }
      }
    },
    template: `
      <input :value="value" @input="onInput" v-reverse:foo="value">
    `,
    methods: {
      onInput (e) {
        var value = e.target.value
        this.$emit('input', value)
      }
    }
  })
  // 全局自定义指令
  Vue.directive('focus', {
    inserted (el, binding, vnode, oldVnode) {
      el.focus()
      console.log('inserted', el, binding, vnode, oldVnode)
    },
    bind (el, binding, vnode, oldVnode) {
      console.log('bind', el, binding, vnode, oldVnode)
    },
    unbind (el, binding, vnode, oldVnode) {
      console.log('unbind', el, binding, vnode, oldVnode)
    },
    update (el, binding, vnode, oldVnode) {
      console.log('update', el, binding, vnode, oldVnode)
    },
    componentUpdated (el, binding, vnode, oldVnode) {
      console.log('componentUpdated', el, binding, vnode, oldVnode)
    }
  })
  /**
   * example
   * 函数简写 & 动态参数指令
   * 一般情况下 bind和update触发行为相同,所以可以简写为同一个回调函数
   */
  Vue.directive('pin', function (el, binding) {
    console.log(binding)
    el.style.position = 'fixed'
    el.style[binding.arg] = binding.value
  })
  var app = new Vue({
    el: '#app',
    data: {
      message: 'hello vue !',
      dir: 'left'
    },
    methods: {
      onInput (val) {
        this.message = val
      }
    }
  })
</script>
</body>
</html>

相关文章

  • season2-全局API

    第1节:Vue.directive 自定义指令 Vue.directive自定义指令 自定义的指令:changec...

  • Vue div节点滚动事件-加载更多

    使用Vue.directive注册全局指令 绑定事件 对于Vue自定义指令不明白的同学请移步: Vue自定义指令 ...

  • VUE-2:自定义指令、事件

    directive自定义指令 我们还可以通过`Vue`提供的directive方法来自定义指令 注册指令 `vue...

  • vue入门6---vue基本指令、自定义指令、插件

    一、vue常用指令概览 二、vue自定义指令 注册全局指令Vue.directive('my-directive'...

  • vue自定义指令初探

    vue自定义指令初探 一、什么是自定义指令 自定义指令是用来操作DOM的。尽管Vue推崇数据驱动视图的理念,但并非...

  • vue 有自定义指令

    vue 的自定义指令,分为全局自定义指令和局部自定义指令,局部自定义指令等价于局部组件。 自定义指令可以对DOM进...

  • Vue指令钩子函数

    Vue指令上篇文章有讲过了,现在分析Vue指令钩子函数。 自定义指令 全局定义:Vue.directive( ' ...

  • vue自定义指令

    除了内置的指令外,Vue 也允许注册自定义指令。 vue用Vue.directive(id,definition)...

  • vue知识集锦(三)

    自定义指令 除了核心功能默认内置的指令 (v-model和v-show),Vue 也允许注册自定义指令。尽管Vue...

  • Vue基础(五)--自定义指令与过渡

    1.自定义指令 分类:全局指令、局部指令 1.1 自定义全局指令 使用全局方法 Vue.directive(指令I...

网友评论

      本文标题:Vue 自定义指令

      本文链接:https://www.haomeiwen.com/subject/vokifhtx.html