首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue.js -具有动态组件的多个事件

Vue.js -具有动态组件的多个事件
EN

Stack Overflow用户
提问于 2017-07-14 13:02:57
回答 1查看 2.5K关注 0票数 1

我有一个简单的根App,它包含两个不同的组件RoomMachine。每个组件都包含一个组件Datatable,这两个组件都是完全相同的。为了在RoomMachine之间切换,我使用了动态组件机制,没有什么特别的。当组件发生变化时,我只会发出事件,组件Datatable应该用当前模块名将其记录在控制台中。问题是,每次我更改组件时,都会多次发送事件。如果我理解得对,在改变组件后,旧组件应该被销毁,新组件应该被创建,那么为什么会发生这种情况呢?我使用的是Vue.js v.2.4.1

当我在组件之间切换时,这里是来自控制台的屏幕快照:

以下是部分内容:

App.vue:

代码语言:javascript
复制
<template>
    <div id="app">
        <select style="padding: 10px" v-model="currentModule" @change="changeComponent">
            <option value="Room">Room</option>
            <option value="Machine">Machine</option>
        </select>
        <component :is="currentModule"></component>
    </div>
</template>

<script>
    import Room from './Room.vue';
    import Machine from './Machine.vue';


    export default {
        name: 'app',
        components: {
            Room,
            Machine
        },
        data () {
            return {
                currentModule: 'Room'
            }
        },
        methods: {
            changeComponent: function() {
                Event.$emit('moduleHasChanged', this.currentModule)
            }
        },
    }
</script>

Machine.vue:

代码语言:javascript
复制
<template>
    <div>
        Machine template

        <datatable></datatable>
    </div>
</template>
<script>
    import Datatable from './Datatable.vue';

    export default {
        components: {
            Datatable
        }
    }
</script>

Room.vue:

代码语言:javascript
复制
<template>
    <div>
        Room template

        <datatable></datatable>
    </div>
</template>
<script>
    import Datatable from './Datatable.vue';

    export default {
        components: {
            Datatable
        }
    }
</script>

Datatable.vue

代码语言:javascript
复制
<template>
    <div>
        Datatable
    </div>
</template>

<script>
    export default {
        created() {
            Event.$on('moduleHasChanged', (currentModule) => {
                console.log(currentModule);
            })
        }
    }
</script>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 16:32:27

之所以会发生这种情况,是因为您一直在添加事件侦听器(在创建Datatable组件时),并且从不删除它们。Vue通常会为您处理这个问题,但是由于您使用的是事件总线,所以您需要自己来处理。

只需添加一个beforeDestroy处理程序并删除事件处理程序即可。

代码语言:javascript
复制
console.clear()
const Event = new Vue()

const Datatable = {
  template: `
    <div>
      Datatable
    </div>
  `,
  methods: {
    moduleChanged(currentModule) {
      console.log(currentModule);
    }
  },
  created() {
    Event.$on('moduleHasChanged', this.moduleChanged)
  },
  beforeDestroy() {
    Event.$off('moduleHasChanged', this.moduleChanged)
  }
}

const Room = {
  template: `
    <div>
      Room template
      <datatable></datatable>
    </div>
  `,
  components: {
    Datatable
  }
}

const Machine = {
  template: `
    <div>
      Machine template
      <datatable></datatable>
    </div>
  `,
  components: {
    Datatable
  }
}

const App = {
  name: 'app',
  template: `
    <div id="app">
        <select style="padding: 10px" v-model="currentModule" @change="changeComponent">
            <option value="Room">Room</option>
            <option value="Machine">Machine</option>
        </select>
        <component :is="currentModule"></component>
    </div>
  `,
  components: {
    Room,
    Machine
  },
  data() {
    return {
      currentModule: 'Room'
    }
  },
  methods: {
    changeComponent: function() {
      Event.$emit('moduleHasChanged', this.currentModule)
    }
  },
}


new Vue({
  el: "#app",
  render: h => h(App)
})
代码语言:javascript
复制
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<div id="app">

</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45103743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档