Vue.js $ emit аргументы не рендеринг динамического компонента? - PullRequest
0 голосов
/ 12 июня 2018

Чего я добиваюсь:

Я пытаюсь добавить несколько различных типов блоков компонентов в родительский компонент App.vue в событии click из дочернего элемента App.vue,используя $emit процесс и динамические компоненты.

Что у меня есть до сих пор:

Дочерний компонент (ButtonSidebar.vue):

<template>
  <div>
    <b-button class="btn-circle absolute-float-tight text-dark" v-on:click="reveal=!reveal">
      <font-awesome-icon v-if="!reveal" :icon="faPlusIcon" />
      <font-awesome-icon v-if="reveal" :icon="faMinusIcon" />
    </b-button>
    <transition name="custom-classes-transition" enter-active-class="animated bounceInDown" leave-active-class="animated bounceOutRight">
      <div v-if="reveal" class="absolute-float-reveal">
        <b-button class="btn-circle text-dark" v-on:click="addCodeBlock"><font-awesome-icon :icon="faCodeIcon" /></b-button>
      </div>
    </transition>
  </div>
</template>

<script>
import FontAwesomeIcon from '@fortawesome/vue-fontawesome'
import faPlus from '@fortawesome/fontawesome-pro-regular/faPlus'
import faMinus from '@fortawesome/fontawesome-pro-regular/faMinus'
import faCode from '@fortawesome/fontawesome-pro-regular/faCode'

export default {
  name: 'ButtonSidebar',
  computed: {
    faPlusIcon () {
      return faPlus
    },
    faMinusIcon () {
      return faMinus
    },
    faCodeIcon () {
      return faCode
    }
  },
  components: {
    FontAwesomeIcon
  },
  data () {
    return {
      reveal: false
    }
  },
  methods: {
    addCodeBlock () {
      this.$emit('addPageBlock', 'CodeBlock')
    },
    addQuoteBlock () {
      this.$emit('addPageBlock', 'QuoteBlock')
    }
  }
}
</script>

Родительский компонент (приложение.vue):

<template>
  <div id="app" class="container">

    <ButtonSidebar @add="addPageBlock"/>

    <div id="pageBlocks" ref="container">
      <component v-for="pageBlock in pageBlocks" v-bind:is="pageBlock.component" v-bind:key="pageBlock.id"></component>
    </div>

  </div>
</template>

<script>
import Vue from 'vue'
import BootstrapVue from 'bootstrap-vue'

import ButtonSidebar from './components/modules/ButtonSidebar'
import CodeBlock from './components/modules/CodeBlock'

import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

Vue.use(BootstrapVue)

export default {
  name: 'App',
  components: {
    AddTitle,
    AddSubTitle,
    ButtonSidebar,
    CodeBlock
  },
  data () {
    return {
      pageBlocks: []
    }
  },
  methods: {
    addPageBlock (componentName) {
      this.pageBlocks.push({ component: componentName })
    }
  }
}
</script>

И для процветания мой базовый компонент CodeBlock:

<template>
  <div :class="type">
    THIS IS A CODE BLOCK!!
  </div>
</template>

<script>
export default {
  name: 'CodeBlock',
  props: [ 'type' ]
}
</script>

По какой-то причине событие v-on: click: "addCodeBlock" работает, нопоследующий запуск emit для родительского компонента не работает ... Я пытался console.log, но ничего не происходит ... может кто-нибудь направить меня в правильном направлении?

1 Ответ

0 голосов
/ 13 июня 2018

ButtonSidebar генерирует событие addCodeBlock, но здесь

<ButtonSidebar @add="addPageBlock"/>

Родитель ожидает событие add.

Попробуйте изменить его следующим образом:

<ButtonSidebar @addCodeBlock="addPageBlock"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...