详解在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 相关文章推荐
JS 拼图游戏 面向对象,注释完整。
Jun 18 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
详解JavaScript中undefined与null的区别
Mar 29 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
jQuery输入框密码的显示隐藏【代码分享】
Apr 29 jQuery
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 Javascript
json 带斜杠时如何解析的实现
Aug 12 Javascript
vue使用showdown并实现代码区域高亮的示例代码
Oct 17 Javascript
Vue将props值实时传递 并可修改的操作
Aug 09 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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
详谈PHP编码转换问题
2015/07/28 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python入门篇之字符串
2014/10/17 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Python中is和==的区别详解
2018/11/15 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
scrapy头部修改的方法详解
2020/12/06 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
群众路线党课主持词
2014/04/01 职场文书
学习退步检讨书
2014/09/28 职场文书
检察院起诉意见书
2015/05/20 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
Python Matplotlib库实现画局部图
2021/11/17 Python
JavaScript执行机制详细介绍
2021/12/06 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
2022/06/25 Javascript
js作用域及作用域链工作引擎
2022/07/07 Javascript