详解在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 相关文章推荐
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
javascript中length属性的探索
Jul 31 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
Dec 10 Javascript
jQuery的$.proxy()应用示例介绍
Apr 03 Javascript
Node.js安装教程和NPM包管理器使用详解
Aug 16 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
全屏滚动插件fullPage.js使用实例解析
Oct 21 Javascript
JavaScript实现省市县三级级联特效
May 16 Javascript
js中的 || 与 &amp;&amp; 运算符详解
May 24 Javascript
工作中常用到的ES6语法
Sep 04 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 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公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
PHP编写RESTful接口
2016/02/23 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
毕业生实习鉴定
2013/12/11 职场文书
市场专员岗位职责
2014/02/14 职场文书
白血病捐款倡议书
2014/05/14 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
幼儿园中班个人总结
2015/02/28 职场文书