Чего я добиваюсь:
Я пытаюсь добавить несколько различных типов блоков компонентов в родительский компонент 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
, но ничего не происходит ... может кто-нибудь направить меня в правильном направлении?