【问题标题】:VUE2 passing parameter from child to parentVUE2将参数从孩子传递给父母
【发布时间】:2017-08-05 15:05:46
【问题描述】:

如何使用 $emit 函数正确地将参数从子级传递给父级? 这是我所做的

HTML

<lista-servizi-gialla :servizi="modello" v-on:centramappa="mappaCenter(x,y,selected)"></lista-servizi-gialla>

组件

template'
<span class="pull-right forward"
 v-on:click="centraNellaMappa(single.x,single.y,single.selected)"></span>',

methods:{
    centraNellaMappa : function(x,y,selected){
        this.$emit('centramappa',[x],[y],[selected]);
     }  
}

父函数

mappaCenter : function(x,y,selected){
    alert(x);
}   

“x”参数似乎无法识别

【问题讨论】:

    标签: javascript vuejs2 emit


    【解决方案1】:

    实际上你差不多了,唯一的问题是你用于内联自定义事件处理程序的写作风格。

    v-on:centramappa="mappaCenter(x,y,selected)"
    

    vue 将在 vue 实例 (this.x ...) 中查找 x、y 和选定的变量。由于您没有在实例中定义它们,因此引发了错误。
    所以你有 3 个解决方案来解决这个问题。

    1. 最简单的一种。您可以像这样传递方法名称。
      v-on:centramappa="mappaCenter"
      vue 将自动匹配该方法并为您传递参数。请参阅下面的演示。

    Vue.component('lista-servizi-gialla', {
      template: `
    <span class="pull-right forward"
     v-on:click="centraNellaMappa(3, 5, true)">
    test 
    </span>
      `,
      methods:{
        centraNellaMappa : function(x, y, selected) {
          this.$emit('centramappa', [x], [y], [selected]);
        }  
      }
    });
    
    new Vue({
      el: '#app',
      methods: {
        mappaCenter: function(x, y, selected){
          //alert(x);
          console.log(`x: ${x}, y: ${y}, selected: ${selected}`);
        }
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
    <div id="app">
    <lista-servizi-gialla v-on:centramappa="mappaCenter"></lista-servizi-gialla>
    </div>
    1. 您还可以将参数包装到一个对象中。 Vue 提供了一个特殊的变量$event,它的值将被设置为你在$emit 事件中传递的第一个参数。
      v-on:centramappa="mappaCenter($event)"
      请参阅下面的演示。

    Vue.component('lista-servizi-gialla', {
      template: `
    <span class="pull-right forward"
     v-on:click="centraNellaMappa(3, 5, true)">
    test 
    </span>
      `,
      methods:{
        centraNellaMappa : function(x, y, selected) {
          this.$emit('centramappa', {x, y, selected});
        }  
      }
    });
    
    new Vue({
      el: '#app',
      methods: {
        mappaCenter: function({ x, y, selected }){
          //alert(x);
          console.log(`x: ${x}, y: ${y}, selected: ${selected}`);
        }
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
    <div id="app">
    <lista-servizi-gialla v-on:centramappa="mappaCenter($event)"></lista-servizi-gialla>
    </div>
    1. 如果您坚持将mappaCenter 方法保留为当前形式,您可以使用JavaScript 规范中定义的arguments 变量。
      v-on:centramappa="mappaCenter(...arguments)"

      v-on:centramappa="mappaCenter(arguments[0], arguments[1], arguments[2])"
      请参阅下面的演示并查看this answer 了解更多信息。

    Vue.component('lista-servizi-gialla', {
      template: `
    <span class="pull-right forward"
     v-on:click="centraNellaMappa(3, 5, true)">
    test 
    </span>
      `,
      methods:{
        centraNellaMappa : function(x, y, selected) {
          this.$emit('centramappa', [x], [y], [selected]);
        }  
      }
    });
    
    new Vue({
      el: '#app',
      methods: {
        mappaCenter: function(x, y, selected){
          //alert(x);
          console.log(`x: ${x}, y: ${y}, selected: ${selected}`);
        }
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>
    <div id="app">
    <lista-servizi-gialla v-on:centramappa="mappaCenter(arguments[0], arguments[1], arguments[2])"></lista-servizi-gialla>
    </div>

    【讨论】:

    • 谢谢你!第二个选择对我来说似乎是最通用的,文档在这一点上不是很清楚
    • @PdsInk 是的,它可能有点晦涩。
    • @choasia 选择了选项一。
    猜你喜欢
    • 2020-07-22
    • 2021-10-16
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2022-11-21
    • 2023-02-08
    相关资源
    最近更新 更多