在Vue中通过自定义指令获取元素

vue.js 是数据绑定的框架,大部分情况下我们都不需要直接操作 DOM Element,但在某些时候,我们还是有获取DOM Element的需求的;http://www.tuicool.com/articles/6Jfiyyz

在 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代码:

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 元素,怎么可能访问的到…… (:з)∠)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值