详解在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 相关文章推荐
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
javascript Array.prototype.slice的使用示例
Nov 14 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
Dec 24 Javascript
jquery自定义函数的多种方法
Jan 09 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
JavaScript实现动态创建CSS样式规则方案
Sep 06 Javascript
理解和运用JavaScript的闭包机制
Aug 13 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
浅谈JavaScript作用域和闭包
Sep 18 Javascript
Vue 创建组件的两种方法小结(必看)
Feb 23 Javascript
Angular CLI 使用教程指南参考小结
Apr 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
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
2014/07/15 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
Python批量修改文本文件内容的方法
2016/04/29 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
医学毕业生自我鉴定
2013/10/30 职场文书
学生自我鉴定模板
2013/12/30 职场文书
老人节标语大全
2014/10/08 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
通用员工手册范本
2015/05/14 职场文书
会计入职心得体会
2016/01/22 职场文书
Django路由层如何获取正确的url
2021/07/15 Python