vue指令

 // 日历组件 点击输入框 可以显示下面的面板
<div v-click-outside="hide">
   // 不能使用@blur="hide"
  <input  type="text" @focus="show">
  <div v-if="isShow"></div>
   //  autofocus="true"不能自动获取焦点
  <input type="text" v-focus>
</div>
data () {
  directives: {
    focus: { 
      inserted (el, bindings, vnode) {
         // Vue.nextTick() // 等待下一轮页面更新好之后
         el.focus()
      }
    }
    // bindings 绑定的一些属性 , vnode虚拟节点 vnode.context表示当前上下文 指令有生命周期 钩子函数 只调用一次
   // bind 当指令绑定上的时候 会执行一次
  // inserted 插入的时候
  // update 当引用得到数据变化时会执行一个钩子
  // componentUpdate 组件变化或者子vnode 全部更新后调用
 // unbind 指令解绑时调用 只调用一次
    clickOutside: {
        bind(el, bindings, vnode) {
          el.handler = function(e) {
              if(!el.contains(e.target)) {
                 // 拿到表达式
                let method = bindings.expression
                vnode.context[method]()
              }
          }
          document.addEventListener('click' , el.handler)
        },
        unbind (el) {
          document.removeEventListener('click', el.handler)
        } 
      
    }
  },
  return {
    msg: 'hello',
    isShow: false
  },
  methods: {
    show () {
      this.isShow = true
    },
    hide () {
      this.isShow = false
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。