一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

详解在Vue中通过自定义指令获取dom元素

时间:2017-05-22 编辑:简简单单 来源:一聚教程网

vue.js 是数据绑定的框架,大部分情况下我们都不需要直接操作 DOM Element,但在某些时候,我们还是有获取DOM Element的需求的;

 在  vue.js 中,获取某个DOM Element常用的方法是将这个元素改成一个组件  (component),然后通过this.$el去获取,但是在一些很小的项目里,在一些没有使用 webpack  等构建工具的项目中,创建一个组件并不是那么值得,所以 vue 提供了另一种操作DOM元素的方式,就是自定义指令 (directive) ;

 自定义指令功能在DOM   Element的生命周期内提供了不同的钩子函数,并允许我们监听指令绑定的数据的变化,但是它也是有缺点的,就是在指令的钩子函数内无法通过this来访问当前  vue 实例,也就无法进一步进行复杂的操作(虽然一般不需要什么复杂的操作),在 vue 的钩子函数 (lifecycle hook) 和方法  (method) 中也无法像this.$el那样轻易的访问到自定义指令绑定的DOM元素;

 不过只要通过一点点变通的做法,就可以突破这个限制:

HTML代码:

 

 代码如下 复制代码

  

  

 

JavaScript代码:

 

 代码如下 复制代码

const vm =newVue({

  el:'#app',

  data : {

    elements : {}

  },

  directives : {

    run (el, binding) {

      if(typeofbinding.value =='function')

        binding.value(el);

    }

  },

  methods : {

    register (flag) {

      return(el)=>{

        this.elements[flag] = el;

      }

    }

  },

  beforeMount () {

    console.log(this.elements.test1);//=> undefined

  },

  mounted () {

    console.log(this.elements.test1);//=> the span DOM Element

    console.log(this.elements.test2);//=> the p DOM Element

  }

})

 

如代码所示,建立一个名为run的自定义指令,运行绑定的方法,并将当前 DOM Element 作为参数传入;
 同时建立一个名为register的方法,接收一个 flag 参数,并根据这个参数返回一个用于将传入参数注册到this.elements对象中的闭包函数;

将写好的 run 指令和 register 方法搭配使用,就可以把想要的 DOM 注册进this.elements,并在 hook 或者 method 中十分方便的访问;

 注意:自定义指令将会在DOM元素插入 Document 时,也就是组件 mount 时首次执行,所以在此之前,比如beforeMount钩子中是无法使用的,这点也和this.$el一致,详情可以查看官方文档中的生命周期图示;

热门栏目