You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中事件监听器为何支持带()与不带()两种绑定方式?

为什么Vue绑定事件监听器时带括号和不带括号都能生效?

先看你给出的示例代码,两种写法确实都能正常触发changeName方法,这背后是Vue对事件绑定的两种不同处理逻辑,我给你拆解清楚:

示例代码回顾

new Vue({
  el: "#app",
  data: {
    userName: "Hello World!"
  },
  methods: {
    changeName: function(e) {
      this.userName = "Name " + Math.random();
    }
  }
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<div id="app">
  <p> {{ userName }} </p>
  <!-- typing in both the input fields trigger changeName -->
  <input @input="changeName()">
  <input @input="changeName">
</div>

1. 不带括号的写法:@input="changeName"

这种写法是Vue事件绑定的「简洁模式」,Vue会帮你做一件事:自动把原生事件对象作为第一个参数传给目标方法。

就像你定义的changeName(e),这里的e就是输入框的input事件对象(比如你可以用e.target.value拿到输入内容)。Vue内部近似的处理逻辑是这样的:

input.addEventListener('input', (event) => {
  this.changeName(event)
})

这种写法最适合不需要传自定义参数、但需要用到事件对象的场景,不用手动操心参数传递,Vue会自动处理。

2. 带括号的写法:@input="changeName()"

这种写法相当于你主动调用了这个方法,默认情况下Vue不会自动传递事件对象。那为什么你的示例里它依然能正常工作?因为你的changeName方法并没有用到e参数——就算e是undefined,方法里修改userName的逻辑照样能跑。

如果你的方法需要用到事件对象,就得手动传递Vue提供的特殊变量$event:

<input @input="changeName($event)">

这时候方法里的e就能拿到事件对象了。另外,这种写法的核心优势是可以传递自定义参数,比如你想给方法传个固定前缀:

methods: {
  changeName(prefix, e) {
    this.userName = prefix + Math.random();
    console.log(e.target.value) // 依然能拿到输入内容
  }
}

模板里就这么写:

<input @input="changeName('新名称-', $event)">

一句话总结

  • 不带括号:Vue自动注入事件对象,适合无自定义参数、需要用事件对象的场景
  • 带括号:需手动传$event拿事件对象,适合要传递自定义参数的场景

你的示例里两种写法都生效,本质是因为方法逻辑不依赖事件对象,所以不管传没传e,都能正常执行~

内容的提问来源于stack exchange,提问作者void

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:56:09