详解在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 setTimeout()函数使用方法
Apr 07 Javascript
json数据与字符串的相互转化示例
Sep 18 Javascript
jQuery获取动态生成的元素示例
Jun 15 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
May 12 Javascript
jQuery中ScrollTo用法示例
Sep 04 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
Vue 进阶教程之v-model详解
May 06 Javascript
详解微信小程序获取当前时间及日期的方法
Apr 28 Javascript
微信小程序实现的canvas合成图片功能示例
May 03 Javascript
Vue父组件向子组件传值以及data和props的区别详解
Mar 02 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 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
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python中实现switch功能实例解析
2018/01/11 Python
查看Django和flask版本的方法
2018/05/14 Python
python中class的定义及使用教程
2019/09/18 Python
Python字节单位转换实例
2019/12/05 Python
python中PyQuery库用法分享
2021/01/15 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
企业办公室主任岗位职责
2015/04/01 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
解析Redis Cluster原理
2021/06/21 Redis
Python基础之变量的相关知识总结
2021/06/23 Python
vue+echarts实现多条折线图
2022/03/21 Vue.js