【问题标题】:Passing event and argument to v-on in Vue.js在 Vue.js 中将事件和参数传递给 v-on
【发布时间】:2017-04-18 19:23:50
【问题描述】:

我在v-on:input 指令中传递了一个参数。如果我不通过它,我可以访问方法中的事件。将参数传递给函数时,我仍然可以访问事件吗?请注意,我使用的是 vue-router。

这是不传参数的。我可以访问事件对象:

HTML

<input type="number" v-on:input="addToCart" min="0" placeholder="0">

Javascript

methods: {
  addToCart: function (event) {
    // I need to access the element by using event.target
    console.log('In addToCart')
    console.log(event.target)
  }
}

这是传递参数的时候。我无法访问事件对象:

HTML

<input type="number" v-on:input="addToCart(ticket.id)" min="0" placeholder="0">

Javascript

methods: {
  addToCart: function (id) {
    // How can I access the element by using event
    console.log('In addToCart')
    console.log(id)
  }
}

这是代码的一部分,它应该足以复制我遇到的问题:

https://jsfiddle.net/lookman/vdhwkrmq/

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    如果要访问事件对象以及传递的数据,则必须将eventticket.id 都作为参数传递,如下所示:

    HTML

    <input type="number" v-on:input="addToCart($event, ticket.id)" min="0" placeholder="0">
    

    Javascript

    methods: {
      addToCart: function (event, id) {
        // use event here as well as id
        console.log('In addToCart')
        console.log(id)
      }
    }
    

    查看工作小提琴:https://jsfiddle.net/nee5nszL/

    已编辑:使用 vue-router 的案例

    如果您使用的是 vue-router,您可能必须在您的 v-on:input 方法中使用 $event,如下所示:

    <input type="number" v-on:input="addToCart($event, num)" min="0" placeholder="0">
    

    这里正在工作fiddle

    【讨论】:

    • 我试过了,但我收到了错误消息Property or method "event" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option
    • @geckob 你从 HTML 传递了事件:v-on:input ?
    • 不确定这是否相关,但我使用的是 vue-router,这发生在其中一个部分
    • @Saurabh @geckob 为了避免错误,需要将特殊的$event变量传递给方法调用v-on:input="addToCart($event, num)"
    • 你应该通过$event,而不是event
    【解决方案2】:

    你也可以这样做......

    <input @input="myHandler('foo', 'bar', ...arguments)">
    

    Evan You 本人在 Vue 论坛上的一篇文章中推荐了这种技术。通常,某些事件可能会发出多个参数。同样,documentation states 内部变量 $event 用于传递原始 DOM 事件。

    【讨论】:

    • jsfiddle.net/50wL7mdz/30115 请注意,使用 *.vue 组件时会转译展开语法,但如果使用浏览器内编译则不会。
    • “...arguments”和“$event”有区别吗?
    • @Raphael 有区别!使用 "$event" 参数,您只能从事件中传递一个参数。
    • 这就是我的解决方案!谢谢
    • 此解决方案有效,与其他解决方案不同。正如 Raphael 所说,它确实允许传递多个参数。
    【解决方案3】:

    根据您需要传递的参数,特别是对于自定义事件处理程序,您可以执行以下操作:

    &lt;div @customEvent='(arg1) =&gt; myCallback(arg1, arg2)'&gt;Hello!&lt;/div&gt;

    【讨论】:

    【解决方案4】:

    我喜欢这种传递参数的方式,因为我们可以使用匿名回调函数来传递事件和参数。

    <button v-on:click="(e)=>deleteHandler(e, args1)" > Click me </button>
    

    【讨论】:

      猜你喜欢
      • 2022-07-15
      • 2017-11-07
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2013-05-31
      相关资源
      最近更新 更多