在Vue中调用方法时的括号

时间:2018-06-01 02:44:52

标签: javascript vue.js vuejs2

在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>
&#13;
&#13;
&#13;

在上面的代码段中,两个输入字段上的输入事件很好地触发changeName,尽管它周围有一个括号()而一个没有。

2 个答案:

答案 0 :(得分:6)

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;

答案 1 :(得分:0)

这两种情况在Vue中都是正确的。但是有一些区别。

报价:https://forum.vuejs.org/t/difference-when-calling-a-method-function-with-or-without-brackets/41764/4

@ input =“ changeName”

事件对象作为第一个传递给事件处理程序 仅将方法名称绑定为事件处理程序时使用参数。

@ input =“ changeName()”

或者,可以将实际的方法调用用作事件处理程序。 这使您可以将任何自定义参数传递给方法。