自定义指令

68 阅读1分钟

全局注册

Vue.directive('selforder',{})

局部注册

export default {
  directive:{
    selforder:{
    	bind(){
        console.log('bind')
      }
    }
  }
}

同时vue也提供了几种自定义指令的钩子函数

bind:指令第一次绑定到元素时调用,只执行一次。 inserted:被绑定的元素,插入到父节点的 DOM 中时调用。update:组件更新时调用。componentUpdated:组件与子组件更新时调用。unbind:指令与元素解绑时调用,只执行一次。

除update 与 componentUpdated 钩子函数之外,每个钩子函数都含有 el、binding、vnode 这三个参数。 oldVnode 只有在 update 与 componentUpdated 钩子中生效。 参数el 就是指令绑定的 DOM 元素,而binding是一个对象,它包含一下属性:name、value、oldValue、expression、arg、modifiers。 ​ 另外值得注意的一点是,除了 el 之外,binding、vnode 属性都是只读的。

例子

v-copy 复制当前的文案

const copy = {
  bind(el, { value }) {
    el.$value = value
    el.handler = () => {
      if (!el.$value) {
        // 值为空的时候,给出提示。可根据项目UI仔细设计
        console.log('无复制内容')
        return
      }
      // 动态创建 textarea 标签
      const textarea = document.createElement('textarea')
      // 将该 textarea 设为 readonly 防止 iOS 下自动唤起键盘,同时将 textarea 移出可视区域
      textarea.readOnly = 'readonly'
      textarea.style.position = 'absolute'
      textarea.style.left = '-9999px'
      // 将要 copy 的值赋给 textarea 标签的 value 属性
      textarea.value = el.$value
      // 将 textarea 插入到 body 中
      document.body.appendChild(textarea)
      // 选中值并复制
      textarea.select()
      const result = document.execCommand('Copy')
      if (result) {
        console.log('复制成功') // 可根据项目UI仔细设计
      }
      document.body.removeChild(textarea)
    }
    // 绑定点击事件,就是所谓的一键 copy 啦
    el.addEventListener('click', el.handler)
  },
  // 当传进来的值更新的时候触发
  componentUpdated(el, { value }) {
    el.$value = value
  },
  // 指令与元素解绑的时候,移除事件绑定
  unbind(el) {
    el.removeEventListener('click', el.handler)
  },
}
 
export default copy