【问题标题】:Is it possible to trigger events using Vue.js?是否可以使用 Vue.js 触发事件?
【发布时间】:2015-11-02 06:27:22
【问题描述】:

我刚开始使用Vue.js 并发现自己在某些情况下不断求助于 jQuery。最近,我尝试“触发”(或模拟)一个事件,例如点击或模糊事件,但未成功。

我知道在 jQuery 中你可以做到以下几点:

$('#my-selector').trigger('click');

但是如何使用 Vue.js 来实现呢?我想尽可能远离使用 jQuery。

以下面为例:

<div id="my-scope">
    <button type="button" v-on="click: myClickEvent">Click Me!</button>
</div>

<script>
new Vue({
    el: "#my-scope",
    data: {
        foo: "Hello World"
    },
    methods: {
        myClickEvent: function(e) {
            console.log(e.targetVM);
            alert(this.foo);
        },
        anotherRandomFunciton: function() {
            this.myClickEvent();
        }
    }
});
</script>

如果我要调用 anotherRandomFunciton,我希望它模拟(或触发)上述点击事件。但是,我尝试这个事件(或上面示例中的 e)永远不会传递给函数。

Vue.js 有实现此目的的方法吗?

【问题讨论】:

  • 你可以使用纯javascript吗?
  • 我猜是这样,但如果是这样的话,我还不如只使用 jQuery。我只是虽然使用 Vue.js 可能有更好的方法来做到这一点
  • 你检查实例方法了吗?您可以在那里调用事件并以更 jQuery 的方式收听事件。 vuejs.org/api/instance-methods.html
  • 您正在尝试模拟点击事件,因此该链接可能也无济于事。

标签: javascript jquery vue.js


【解决方案1】:

您需要像这样使用v-el 来获取对您的按钮的引用:

<button type="button" @click="myClickEvent" v-el:my-btn>Click Me!</button>

然后,在你的方法中:

function anotherRandomFunction() {
    var elem = this.$els.myBtn
    elem.click()
}

这只是一个原生的 DOM 点击事件。见v-el Documentation

或者从 Vue 2.x 开始:

<template>
    <button type="button" @click="myClickEvent" ref="myBtn">
        Click Me!
    </button>
</template>

<script>
export default {
    methods: {
        myClickEvent($event) {
            const elem = this.$refs.myBtn
            elem.click()
        }
    }
}
</script>

因为 Vue 只使用和监听原生 DOM 事件。您可以使用Element#dispatchEvent 触发原生 DOM 事件,如下所示:

var elem = this.$els.myBtn; // Element to fire on

var prevented = elem.dispatchEvent(new Event("change")); // Fire event

if (prevented) {} // A handler used event.preventDefault();

这不是完全理想或最佳实践。理想情况下,您应该有一个处理内部的函数和一个调用该函数的事件处理程序。这样,您可以在需要时调用内部。

【讨论】:

【解决方案2】:

如果有人偶然发现,我就是这样做的:

当使用this.$refs.myBtn.click()

我明白了

“未捕获的 TypeError:this.$refs.myBtn.click 不是函数”

改为:this.$refs.myBtn.$el.click()

要明确:需要添加“$el”才能使其工作。

【讨论】:

  • 我认为这可能取决于您的代码和/或 Vue 版本。 this.$refs.filterGroupLegend.click() 在 2.5.16 中为我工作。
  • @the_dude_abides 这取决于您是在处理对组件的点击还是对原生 DOM 元素的点击。对原生元素使用 $el。旁注,甜蜜的手感
  • 谢谢@james.brndwgn!
  • 我试图触发一个组件的@remove 事件,this.$refs.pictureInput.remove() 显示错误,说它不是你所说的函​​数,所以当使用this.$refs.pictureInput.$el.remove() 它调用本机remove() 我猜测并从视图中删除元素。有什么建议可以避免这种情况吗?
  • 好的,我实际上是在尝试调用一个方法调用,但方法的名称是错误的,我的错!取好名字后,它起作用了。
【解决方案3】:

Vue 本质上是专注于狭隘的——它旨在与 jQuery 等其他包一起使用(编辑:对于 jQuery 功能 other 而不是 DOM 操作)与它一起使用。我觉得用jQuery的trigger就好了。

但是,如果您想在不使用 jQuery 的情况下创建自己的事件,请查看dispatchEvent

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent

或者,对于单击的特定情况,您可以使用 DOM 元素上的一种方法:

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click

【讨论】:

  • 我不认为这种说法是正确的...... >它打算与其他包如 jQuery 一起使用
  • @Grant 从你只希望 Vue 修改 DOM 的角度来看,你是对的。但总的来说,Vue 的关注点非常狭窄,并且很容易合并其他包,例如 Sortable.js,因此您最终会得到类似 Vue.Draggable 的东西。
  • 这个答案是绝对错误的。 Vue 旨在取代 jquery。将 jquery 与 vue 一起使用充其量只是一种 hack,而且绝对是不好的做法。
  • Vue 并不是要取代 jQuery。 Vue 旨在取代直接的 DOM 操作。 jQuery 不仅可以用于 DOM 操作。
  • 绝对不是 - 将 jQuery 与任何现代 SPA JS 框架一起使用是一个相当公平的迹象,表明您没有正确使用该框架。
猜你喜欢
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2021-05-10
  • 2011-03-30
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多