详解在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 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
番茄的表单验证类代码修改版
Jul 18 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
Jan 26 Javascript
浅析javascript函数表达式
Feb 10 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 Javascript
JS小数转换为整数的方法分析
Jan 07 Javascript
Javascript 实现匿名递归的实例代码
May 25 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
May 31 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
Sep 02 Javascript
js 根据对象数组中的属性进行排序实现代码
Sep 12 Javascript
vue props对象validator自定义函数实例
Nov 13 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对网站验证码进行破解
2015/09/17 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
javascript中创建对象的三种常用方法
2010/12/30 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
javascript 操作符(~、&amp;、|、^、)使用案例
2014/12/31 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
Javascript复制实例详解
2016/01/28 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
工作态度检讨书
2014/02/11 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
机关出纳岗位职责
2014/04/03 职场文书
网络优化专员求职信
2014/05/04 职场文书
社区活动策划方案
2014/08/21 职场文书
关于车尾的标语大全
2015/08/11 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP