在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>

在上面的代码片段中,两个输入字段上的输入事件都会很好地触发changeName,尽管其中一个字段有括号(),另一个字段没有.

推荐答案

这在https://vuejs.org/v2/guide/events.html#Method-Event-Handlers篇文章中得到了很好的解释.

基本上,事件处理程序可以是

  • 方法名,例如@input="changeName"
  • 有效的Javascript语句,例如@input="changeName()"@input="userName = 'Name '+Math.random()"

Vue会自动执行判断,以检测是哪种情况.

如果你感兴趣,请在https://github.com/vuejs/vue/blob/19552a82a636910f4595937141557305ab5d434e/dist/vue.js#L10086处查看此核心代码.

var handlerCode = isMethodPath
  ? ("return " + (handler.value) + "($event)")
  : isFunctionExpression
    ? ("return (" + (handler.value) + ")($event)")
    : handler.value;

Vue.js相关问答推荐

Nuxt 3翻转本视频

Vue 3使用计算(computed)属性对象获取图像信息,在模板中呈现值时变为NaN

如何在 v-for 指令切换状态下安全地制作包含附加到对象的复选框的列表(W/O 切换列表中的其他复选框)?

Vuetify 扩展面板,面板标题左侧带有图标

在Vue cli项目中,Laravel api app放在哪里以及如何在vue js中调用api?

如何在vue中动态加载组件

vuejs 中的单元测试

如何在 .js 文件中使用 Vue i18n 翻译?

Vue&TypeScript:在项目目录外的 TypeScript 组件中实现导入时如何避免错误 TS2345?

Keycloak:用户基于角色的客户端登录访问限制

VueRouter 未定义

如何在 vue 3 中获取路由的参数?

如何使用 VueJS / Typescript 导入 JSON 文件?

为什么 v-model 不适用于数组和 v-for 循环?

Vuejs 3 从子组件向父组件发出事件

简单的点击功能不触发

从子组件 Vue 更新父模型

Vue 3 组合 API 数据()函数

Apollo 客户端在向服务器发送Mutations 时返回400(错误请求)错误

将鼠标悬停在 TailwindCSS 中的 div 上时显示按钮