【问题标题】:Vue.js $emit arguments not rendering a dynamic component?Vue.js $emit 参数不呈现动态组件?
【发布时间】: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


【解决方案1】:

ButtonSidebar 会在此处发出 addCodeBlock 事件

<ButtonSidebar @add="addPageBlock"/>

父级正在侦听add 事件。

尝试像这样改变它:

<ButtonSidebar @addCodeBlock="addPageBlock"/>

【讨论】:

  • 完美运行。谢谢克里斯托夫
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 2019-04-05
  • 2020-02-10
  • 2017-03-31
相关资源
最近更新 更多