详解在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 相关文章推荐
一实用的实现table排序的Javascript类库
Sep 12 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
Apr 01 Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
JavaScript使用RegExp进行正则匹配的方法
Jul 11 Javascript
Javascript设计模式之观察者模式(推荐)
Mar 29 Javascript
checkbox批量选中,获取选中项的值的简单实例
Jun 28 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
详解vue渲染从后台获取的json数据
Jul 06 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
koa-router源码学习小结
Sep 07 Javascript
Vue formData实现图片上传
Aug 20 Javascript
Vue微信公众号网页分享的示例代码
May 28 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 foreach 参数强制类型转换的问题
2010/12/10 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
分享PHP守护进程类
2015/12/30 PHP
[原创]php简单隔行变色功能实现代码
2016/07/09 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
Use Word to Search for Files
2007/06/15 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python使用OpenCV进行标定
2018/05/08 Python
python输入多行字符串的方法总结
2019/07/02 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
会计个人实习计划书
2014/08/15 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android