Vue.js $发出不渲染动态组件的参数?

时间:2018-06-12 20:33:17

标签: javascript vue.js vuejs2 vue-component

我想要实现的目标:

我尝试使用$emit进程和动态组件,在App.vue的子项内的click事件上向父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:点击:&#34; addCodeBlock&#34;事件正在发挥作用,但随后将发射物发射到父组件不起作用......我已经尝试console.log但没有任何事情发生......有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

ButtonSidebar会发出addCodeBlock个事件,但此处

<ButtonSidebar @add="addPageBlock"/>

家长正在侦听add事件。

尝试改变它:

<ButtonSidebar @addCodeBlock="addPageBlock"/>