我刚刚开始使用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有实现此目的的方法吗?
答案 0 :(得分:48)
您需要使用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();
这不是完全理想或最佳实践。理想情况下,您应该有一个处理内部的函数和一个调用该函数的事件处理程序。这样,您可以随时调用内部。
答案 1 :(得分:7)
如果有人偶然发现了这一点,我就是这样做的:
使用 this.$refs.myBtn.click()
我得到了
“Uncaught TypeError:this。$ refs.myBtn.click不是函数”
将其更改为: this.$refs.myBtn.$el.click()
要明确:“ $el
”需要添加才能发挥作用。
答案 2 :(得分:1)
Vue本质上是狭隘的 - 它的目的是与jQuery一起使用其他软件包。我认为使用jQuery的trigger
就好了。
但是,如果您想在没有jQuery的情况下创建自己的事件,请查看dispatchEvent
:
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent
或者,对于click的特定情况,您可以使用DOM元素的方法:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click