79

i'm trying to emit function with parameters like that.

template: `
    <div class="searchDropDown">
    <div class="dropdown is-active">
    <div class="dropdown-trigger">
      <button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
        <span>{{selectedItem}}</span>
      </button>
    </div>
    <div class="dropdown-menu" id="dropdown-menu" role="menu">
      <div class="dropdown-content">
        <a class="dropdown-item" v-for="item in drop" @click="$emit('select-menu-item($event)')">
          {{item.name}}
        </a>
      </div>
    </div>
  </div>
    </div>
  `

here is the i'm trying to pass item to method like a parameter.

here is my component which i try to emit function:

<search-component v-bind="searchProps" @select-menu-item="selectedITem($event)"></search-component>

and here is my method:

selectedITem(arg1) {
      console.log("cl")
      console.log(arg1)
    }

here is if i'm not trying to pass parameter everything well work so my method selectedITem is working. When i try to pass parameter like that nothing happened and i'm not getting some error.

user3348410
  • 2,733
  • 10
  • 51
  • 85

3 Answers3

169

The following argument(s) in $emit() are the arguments in your emitted function.

$emit('select-menu-item', $event, 1, 2, 3, 4, "cupcakes")

and in your component method.

selectMenuItem: function(evt, num1, num2, num3, num4, food){

}

And in your actual component markup, you don't need to add arguments, just write the reference to the method without parenthesis.

<search-component v-bind="searchProps" @select-menu-item="selectMenuItem">

SAMPLE

window.onload = function(){
 const component = function() {
    return {
       template: `
       <div>
         <button @click="$emit('click-me', 'foobar')">
            Click Me
         </button>
       </div>
       `,
       props: ["data"]
    }
 }

 new Vue({
       el: container,
       data: {},
       components: { "my-component": component(), },
       methods: {
          clickMe: function(str){
            console.log(str);
          }
       }
    });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="container">
  <my-component :data=$data @click-me="clickMe"></my-component>
</div>
Abana Clara
  • 4,602
  • 3
  • 18
  • 31
31

just adding more answer from @Albana Clara.

You can merge your parameter along with the event passed.

EXAMPLE:

<search-component v-bind="searchProps" @select-menu-item="selectMenuItem('test', ...arguments)">
selectMenuItem: function(a, b) {
  console.log(a + " " + b);
  // test foobar
}
Iqbal Tawakkal
  • 445
  • 4
  • 11
  • 8
    Thanks. This is really helpful for when you want to pass in some extra arguments from the parent component. – xji Mar 24 '21 at 23:19
6

If anyone searching how emits work in Vue3 with Composition API:

In the child component:

<script setup>

  const emit = defineEmits(["updateItem", "updateCount"])

  function itemizedLot() {
    emit("updateItem", param1, param2)
  }

  function countedLot() {
    emit("updateCount", param3, param4)
  }

</script>

<template>
  <button @click="itemizedLot"> Btn1 </button>
  <button @click="countedLot"> Btn2 </button>
</template>

In the parent component:

<script setup>

  // access the emitted methods and their parameters

  function updateMenuItem(param1, param2) {
    ...
  }

  function updateMenuCount(param3, param4) {
    ...
  }

</script>

<template>
  <MyButton @update-item="updateMenuItem" @update-count="updateMenuCount"/>
</template>
Lahiru
  • 1,428
  • 13
  • 17