Search code examples
javascriptvue.jscomponents

Emit event with parameters in vue


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.


Solution

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