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

 更新时间:2017年03月04日 13:27:07   作者:不带汽的可乐  
本篇文章主要介绍了详解在Vue中通过自定义指令获取dom元素 ,具有一定的参考价值,有兴趣的可以了解一下。

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代码: 

    <div id="app">
      <span class='test' v-run="register('test1')"></span>
      <p class='test' v-run="register('test2')"></p>
    </div> 

JavaScript代码:

const vm = new Vue({
  el:'#app',
  data : {
    elements : {}
  },
  directives : {
    run (el, binding) {
      if (typeof binding.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 一致,详情可以查看官方文档中的生命周期图示

其实也很好理解啦……在 mount 之前,根本就没有这个实际的 DOM 元素,怎么可能访问的到……(:з)∠)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • element-ui中el-input只输入数字(包括整数和小数)

    element-ui中el-input只输入数字(包括整数和小数)

    开发中有时候需要input只能输入数字,下面这篇文章主要给大家介绍了关于element-ui中el-input只输入数字(包括整数和小数)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • vue项目中v-model父子组件通信的实现详解

    vue项目中v-model父子组件通信的实现详解

    vue.js,是一个构建数据驱动的 web 界面的库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。下面这篇文章主要给大家介绍了关于vue项目中v-model父子组件通信实现的相关资料,需要的朋友可以参考下。
    2017-12-12
  • 用了这么久的Vue3你真的了解Proxy了吗

    用了这么久的Vue3你真的了解Proxy了吗

    Proxy是ES6引入的一个新特性,它允许你创建一个代理对象,用于拦截对目标对象的访问,但用了这么久的vue3,你真的懂Proxy吗,本文就来和大家深入聊聊Proxy吧
    2023-06-06
  • vue3封装ECharts组件详解

    vue3封装ECharts组件详解

    前端开发需要经常使用ECharts图表渲染数据信息,在一个项目中我们经常需要使用多个图表,选择封装ECharts组件复用的方式可以减少代码量,增加开发效率。感兴趣的可以阅读一下本文
    2023-04-04
  • vue使用recorder-core.js实现录音功能

    vue使用recorder-core.js实现录音功能

    这篇文章主要介绍了vue如何使用recorder-core.js实现录音功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • vue指令v-html和v-text

    vue指令v-html和v-text

    这篇文章主要介绍了 vue指令v-html和v-text,文章围绕vue指令v-html和v-text的相关资料展开详细内容,需要的小伙伴可以参考一下,希望对大家有所帮助
    2021-11-11
  • 浅谈Vue 自动化部署打包上线

    浅谈Vue 自动化部署打包上线

    这篇文章主要介绍了浅谈Vue 自动化部署打包上线,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Vue组件大全包括(UI组件,开发框架,服务端,辅助工具,应用实例,Demo示例)

    Vue组件大全包括(UI组件,开发框架,服务端,辅助工具,应用实例,Demo示例)

    本文为大家分享了网上比较流行的Vue组件,包括UI组件,开发框架,服务端,辅助工具,应用实例,Demo示例等开源项目,总有一款适合你
    2018-10-10
  • 详解win7 cmd执行vue不是内部命令的解决方法

    详解win7 cmd执行vue不是内部命令的解决方法

    这篇文章主要介绍了详解win7 cmd执行vue不是内部命令的解决方法的相关资料,这里提供了解决问题的详细步骤,具有一定的参考价值,需要的朋友可以参考下
    2017-07-07
  • vue路由拦截的三种方法小结

    vue路由拦截的三种方法小结

    本文给大家介绍了vue路由拦截的三种方法,全局前置守卫,路由独享守卫和全局后置钩子这三种方法,并通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02

最新评论