详解在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 源码分析笔记(3) Deferred机制
Jun 19 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
Jan 15 Javascript
js简单实现用户注册信息的校验代码
Nov 15 Javascript
Javascript基础教程之函数对象和属性
Jan 18 Javascript
JS实现跟随鼠标立体翻转图片的方法
May 04 Javascript
JavaScript中apply方法的应用技巧小结
Sep 29 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
Oct 12 Javascript
详解jQuery简单的表格应用
Dec 16 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
Apr 29 Javascript
javascript创建元素和删除元素实例小结
Jun 19 Javascript
vue中可编辑树状表格的实现代码
Oct 31 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
python使用SMTP发送qq或sina邮件
2017/10/21 Python
对numpy中轴与维度的理解
2018/04/18 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python从Oracle读取数据生成图表
2020/10/14 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
工商管理专业应届生求职信
2013/11/04 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
国庆促销活动总结
2014/08/29 职场文书
学校食品安全责任书
2015/01/29 职场文书
纯html+css实现打字效果
2021/08/02 HTML / CSS