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


Posted in Javascript onMarch 04, 2017

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 元素,怎么可能访问的到……(:з)∠)

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

Javascript 相关文章推荐
JavaScript XML操作 封装类
Jul 01 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 Javascript
js数组操作学习总结
Nov 04 Javascript
jquery实现的一个文章自定义分段显示功能
May 23 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
Nov 26 Javascript
第三章之Bootstrap 表格与按钮功能
Apr 25 Javascript
JavaScript数组操作函数汇总
Aug 05 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
Mar 09 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
Vuex 使用 v-model 配合 state的方法
Nov 13 Javascript
vant中的toast层级改变操作
Nov 04 Javascript
在javaScript中检测数据类型的几种方式小结
Mar 04 #Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
Mar 04 #Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
Mar 04 #Javascript
php输出全部gb2312编码内的汉字方法
Mar 04 #Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
Mar 04 #Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
Mar 04 #Javascript
简单实现js菜单栏切换效果
Mar 04 #Javascript
You might like
php正则表达式使用的详细介绍
2013/04/27 PHP
深入PHP curl参数的详解
2013/06/17 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
PHP基于反射机制实现插件的可插拔设计详解
2016/11/10 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
动态添加js事件实现代码
2009/03/12 Javascript
模拟电子签章盖章效果的jQuery插件源码
2013/06/24 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
nodejs微信开发之接入指南
2019/03/17 NodeJs
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
vue解决跨域问题(推荐)
2020/11/10 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
Python3基础之list列表实例解析
2014/08/13 Python
python多线程编程中的join函数使用心得
2014/09/02 Python
分享Python文本生成二维码实例
2016/01/06 Python
Python实现网站注册验证码生成类
2017/06/08 Python
Python实现图片拼接的代码
2018/07/02 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
企业后勤岗位职责
2014/02/28 职场文书
世界文化遗产导游词
2015/02/13 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
javaScript Array api梳理
2021/03/31 Javascript
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android