Home > Software engineering >  How to use js to dynamically add components and listen to their events in vue3?
How to use js to dynamically add components and listen to their events in vue3?

Time:06-21

I've recently been learning Vue3. I want to add components dynamically, and the parent component can listen to the events of the added chirld components. To make it clear what I want to do, I have written the following code. I want a new button to be added when the mouse moves over any of the buttons. But only the first button actually triggers the hello function, which means that the code "v-on:addButton": hello in line 7 of App.vue doesn't work. I would like to know how to modify the code to meet my requirements, or if there is another easy way to implement this functionality.

Chirld components/Hello.vue

<script setup lang="ts">
  defineProps(['text'])
  defineEmits(['addButton'])
</script>

<template>
  <button @mouseenter="$emit('addButton')">{{text}}</button>
</template>

Father App.vue

<script setup>
  import {createApp} from 'vue'
  import Hello from './components/Hello.vue'
    
  let cnt = 0
  function hello() {
    console.log('you enter a button')
    const app = createApp(Hello, {"text": String(cnt  ), "v-on:addButton": hello})
    const newNode = document.createElement('div')
    document.getElementById("rootDiv").append(newNode)
    app.mount(newNode)
  }
</script>

<template>
  <div id="rootDiv">
    <Hello text="0" v-on:addButton="hello"/>
  </div>
</template>

CodePudding user response:

Manipulating the DOM directly in most cases doesn't work with Vue since you'll loose the reactivity and other binding stuff, another approach is to use cnt variable to render the components using v-for directive ;:


<script setup>
  import {ref} from 'vue'
  import Hello from './components/Hello.vue'
  
  let cnt = ref(0)
  function addBtn() {
     cnt.value  
  }
</script>

<template>
  <div id="rootDiv">
    <Hello v-for="i in cnt" :text="i" v-on:addButton="addBtn"/>
  </div>
</template>
  • Related