在Vue.js中,当父级的v-on传递另一个参数时,如何从子级向父级发出多个值?

use*_*565 8 javascript vue.js

这是一个代码示例。

Vue.component('button-counter', {
  template: '<button v-on:click="emit_event">button</button>',
  methods: {
    emit_event: function () {
      this.$emit('change', 'v1', 'v2', 'v3')  // Here I emit multiple value
    }
  },
})
new Vue({
  el: '#parent',
  data: {
    args: ""
  },
  methods: {
    change: function (...args) {
      this.args = args
      console.log(args)
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.common.js"></script>
<div id="parent">
  {{ args }} <br />
  <button-counter v-on:change="change(1234, $event)"></button-counter>
</div>
Run Code Online (Sandbox Code Playgroud)

从父组件,我想通过change()获取参数传递(在本示例中为1234),还需要子组件发出的每个值。我尝试使用$ event捕获子发射的值,但是$ event仅设置为第一个子发射的值(在此示例中为'v1')

有什么办法吗?我知道我可以发出一个数组来捕获多个值。但是某些库只是发出多个值。

这是上面示例的codepen。 https://codepen.io/anon/pen/MmLEqX?editors=1011

小智 10

我会这样做:

<button-counter v-on:change="change(1, ...arguments)">
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以使用解构语法

this.$emit('change', { x:'v1', y:'v2', z: 'v3' })
Run Code Online (Sandbox Code Playgroud)

你可以像这样访问这些值

<button-counter @change="change"></button-counter>

methods: { change({x, y, z}) { .... } }
Run Code Online (Sandbox Code Playgroud)

  • 如此优雅!谢谢!`this.$emit('blur', { e, $ref: this });` --&gt; `handlerOnBlur({ e, $ref }) {}` (3认同)

Ber*_*ert 5

定义一个处理程序,该处理程序接受事件中的多个参数,并将其传递给除静态参数之外的change方法。

<button-counter v-on:change="(...args)=>this.change(1234,...args)"></button-counter>
Run Code Online (Sandbox Code Playgroud)

或者

<button-counter v-on:change="(...args)=>this.change([1234,...args])"></button-counter>
Run Code Online (Sandbox Code Playgroud)

并将您的方法更改为

change: function (args) {
  this.args = args
  console.log(args)
}
Run Code Online (Sandbox Code Playgroud)

  • @Craig似乎很容易将答案转换为常规函数语法。我认为这样做没有意义。如果您在不支持箭头功能的环境中编写代码,则扩展语法也不大可能起作用。无论如何,您都可以自由地提供自己的答案,而无需使用箭头功能。 (21认同)