详解在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 相关文章推荐
基于jQuery的实现简单的分页控件
Oct 10 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 Javascript
JSON.stringify 语法实例讲解
Mar 14 Javascript
jquery validate poshytip 自定义样式
Nov 26 Javascript
IE与FireFox的JavaScript兼容问题解决办法
Dec 31 Javascript
js禁止页面刷新与后退的方法
Jun 08 Javascript
js实现n秒倒计时后才可以点击的效果
Dec 20 Javascript
原生JS和jQuery操作DOM对比总结
Jan 19 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
Mar 08 Javascript
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
详解在vue-cli中使用路由
Sep 25 Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
Use Word to Search for Files
2007/06/15 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
Python单例模式的两种实现方法
2017/08/14 Python
Python3中列表list合并的四种方法
2019/04/19 Python
python构造函数init实例方法解析
2020/01/19 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
numpy实现RNN原理实现
2021/03/02 Python
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
2014年审计工作总结
2014/11/17 职场文书
安全先进班组材料
2014/12/26 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
改造DE1103三步曲
2022/04/07 无线电
mysql sql常用语句大全
2022/06/21 MySQL