详解在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写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
深入理解javascript中defer的作用
Dec 11 Javascript
jquery实现网页查找功能示例分享
Feb 12 Javascript
JS截取url中问号后面参数的值信息
Apr 29 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
Jun 20 Javascript
javascript实现可全选、反选及删除表格的方法
May 15 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
Oct 10 Javascript
微信小程序开发经验总结(推荐)
Jan 11 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
Jul 26 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
Mar 30 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
Jul 27 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+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
jquery实现数字输入框
2017/02/22 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python实现二叉堆
2016/02/03 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Linux下python制作名片示例
2018/07/20 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
python计算无向图节点度的实例代码
2019/11/22 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
英语师范专业毕业生自荐信
2013/09/21 职场文书
办公室助理岗位职责
2013/12/25 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
统招统分证明
2015/06/23 职场文书
mysql优化
2021/04/06 MySQL
python控制台打印log输出重复的解决方法
2021/05/14 Python