详解在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 相关文章推荐
不错的新闻标题颜色效果
Dec 10 Javascript
jQuery Tools tooltip使用说明
Jul 14 Javascript
js切换div css注意的细节
Dec 10 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
Jan 16 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
Mar 07 Javascript
javascript中String对象的slice()方法分析
Dec 20 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
Dec 17 Javascript
Google 地图类型详解及示例代码
Aug 06 Javascript
通过BootStrap实现轮播图的实际应用
Sep 26 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
在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 array数组的教程详解
2013/06/05 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
javascript 日期常用的方法
2009/11/11 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
python获取android设备的GPS信息脚本分享
2015/03/06 Python
Python实现处理管道的方法
2015/06/04 Python
详解python之简单主机批量管理工具
2017/01/27 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
计算机毕业大学生推荐信
2013/12/01 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
四年级数学教学反思
2016/02/16 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server