详解在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 函数调用规则
Aug 26 Javascript
10个实用的脚本代码工具
May 04 Javascript
JQuery文本框高亮显示插件代码
Apr 02 Javascript
简单的jquery拖拽排序效果实现代码
Sep 20 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
May 25 Javascript
快速学习AngularJs HTTP响应拦截器
Dec 31 Javascript
jQuery数据类型小结(14个)
Jan 08 Javascript
基于Node.js模板引擎教程-jade速学与实战1
Sep 17 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
Jan 12 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
js实现图片推拉门效果代码实例
May 18 Javascript
解决layer.confirm选择完之后消息框不消失的问题
Sep 16 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
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
jquery对表单操作2
2011/04/06 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
天那边观后感
2015/06/09 职场文书
企业安全生产规章制度
2015/08/06 职场文书
关于五一放假的通知
2015/08/18 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
车辆挂靠协议书
2016/03/23 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
Python OpenCV实现图像模板匹配详解
2022/04/07 Python