【发布时间】:2018-11-22 08:08:16
【问题描述】:
我想要达到的目标:
我正在尝试使用$emit 进程和动态组件,在 App.vue 的子级中的单击事件上将许多不同的组件块类型添加到父级 App.vue 组件。
到目前为止我所拥有的:
子组件(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>
父组件(App.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" 事件正在工作,但随后向父组件发出的发射不起作用......我试过 console.log 但没有任何反应通过...谁能指出我正确的方向?
【问题讨论】:
-
ButtonSideBar 正在发出
addPageBlock,但 App 正在监听add、@add="addPageBlock"。此外,不要使用驼峰式事件名称。使用 kebab-case,add-page-block. -
@Bert - 合而为一,所以当然是绑定而不是方法。当它为你拼写出来时很愚蠢!谢谢你:)
-
@Bert 只是好奇我为什么要避免使用驼峰式事件名称?
-
@Brissy 现在已涵盖in the documentation。他们比我在评论中解释得更好:)
标签: javascript vue.js vuejs2 vue-component