簡體   English   中英

Vue 父組件無法捕獲子組件發出的事件

[英]Vue parent component unable to catch event emitted from the child

Child 正在發出一個自定義事件:

<template>
  <div id="controls-container" class="controls-container">
    <div class="control-button icon-zoom-in" @click="zoomHandler('+')"></div>
    <div class="control-button icon-zoom-out" @click="zoomHandler('-')"></div>
    </div>
  </div>
</template>

<script>

export default {
    name: "ControlsContainer",
    methods: {
        zoomHandler(direction) {
            console.log("this will print");
            this.$emit('zoomHandler', direction);
        }
    }
};

</script>

父母沒有抓住它:

<template>
  <div id="map" ref="map" class="navigation-map">
    <controls-container @zoomHandler="zoom"></controls-container>
  </div>
</template>

<script>

import ControlsContainer from "./ControlsContainer.vue";

export default {
    name: "NavigationMap",
    components: { ControlsContainer },
    methods: {
        zoom(direction) {
            console.log("will not print");
            if (direction === "+") {
                this.map.zoomIn();
            } else if (direction === "-") {
                this.map.zoomOut();
            } else {
                // Do nothing
            }
        },
    },

</script>

我現在已經閱讀了大約 7 篇關於這方面的教程,它們都展示了它是如何以與我完全相同的方式完成的。 考慮到我在這件事上浪費的時間,我真的希望這不是一件很簡單的事情......

我注意到您的子組件中缺少<script>標記。 你的問題是那個錯字嗎? 如果他們不在那里,那么這可以解釋你遇到的問題。

不要對 DOM 屬性使用 Camel Case,這也適用於發射器和自定義事件。

在您的孩子中,重構為:

this.$emit('zoom-handler', direction);

在您的父母中,重構為:

<controls-container @zoom-handler="zoom"></controls-container>

通過代碼和框的工作示例。io 我必須在新窗口/標簽中打開預覽才能正確顯示。

您可以使用它作為替代方案。

<template>
  <div id="controls-container" class="controls-container">
    <div class="control-button icon-zoom-in" @click="zoomHandler('+')"></div>
    <div class="control-button icon-zoom-out" @click="zoomHandler('-')"></div>
    </div>
  </div>
</template>

export default {
    name: "ControlsContainer",
    methods: {
        zoomHandler(direction) {
            console.log("this will print");
            this.$root.$emit('zoomHandler', direction);
        }
    }
};



<template>
  <div id="map" ref="map" class="navigation-map">
    <controls-container></controls-container>
  </div>
</template>

<script>

import ControlsContainer from "./ControlsContainer.vue";

export default {
    name: "NavigationMap",
    components: { ControlsContainer },
    methods: {
    },
    beforeDestroy(){
      this.$root.$off("zoomHandler")
    },
    mounted(){
      this.$root.$on("zoomHandler", (direction)=>{
        if (direction === "+") {
                this.map.zoomIn();
            } else if (direction === "-") {
                this.map.zoomOut();
            } else {
                // Do nothing
            }
      })
    }
</script>

這些組件沒有嵌套,因此 Map 實際上不是父級。 這樣做會導致其他一些問題。 不值得麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM