当前位置: 首页 > 知识库问答 >
问题:

发射组件:is

柳俊逸
2023-03-14

我正在构建一个仪表板应用程序,用户可以选择出现在某些位置的小部件。我这样做是利用

<component :is="name-of-component">

这一切都很好,但我希望用户能够编辑组件并将更改发送到父级。例如,通过编辑,组件1显示欢迎消息,用户可以更改该消息。

现在我有以下几点

仪表板vue

<template>
  <component :is="name-of-component"></component>
</template>
<script>
  data () {
    return {
      name-of-component: 'selected-component-name'
    }
  }
</script>

脚本中是计算的、挂载的等等,我认为这与问题无关。

由于Im使用组件:Im发现传递道具和发出更改很棘手。在我的商店里,我有两个组件的道具(标题

Emit也给我带来了一个问题。当然,我可以通过硬编码来发出对组件的调用,但是因为我使用了:它对我不起作用。

这里是什么工作,但我需要使它作为任何组件动态:是wan包含任何小部件。有什么想法吗?

<component 
  :is="welcomeMessage" 
  :props="dashboard.welcomeMessage" 
  @update-welcomeMessage="welcomeMessage(e)">
</component>

<component 
  :is="busStops" 
  :props="dashboard.myBusStop" 
  @update-busStop="busStop(e)">
</component>

我希望有这些组件,这样我就可以引入不同的关注点,让每个关注点都更像这样,其中“组件名称”可以用来填充:is、:props和@update:

<component 
  :is="name-of-component" 
  :props="dashboard.name-of-component" 
  @update-name-of-component="name-of-component(e)">
</component>

共有1个答案

巫朝明
2023-03-14

您可以使用v-bindv-on功能,并使用计算属性,就像您已经在做的那样。我会解释自己:

<some-component @some-event="doThis" foo="bar"></some-component>

和写作一样:

<some-component v-bind="{foo: 'bar'}" v-on="{'some-event': doThis}"></some-component>

这意味着您可以编写计算属性来计算要用于动态组件的侦听器和属性。

如果你愿意,我在jsFiddle上写了一个完整的例子:https://jsfiddle.net/tsc2pmrx/

模板:

<div id="app">
  <component :is="componentToUse" v-on="listeners" v-bind="attributes"></component>
</div>

JS:

Vue.component('greeting', {
    props: ['name'],
  template: '<h1>Welcome {{ name }} !</h1>',
  mounted () {
    setTimeout(() => {
        this.$emit('some-event')
    }, 2000)
  }
});

Vue.component('other-component', {
    template: '<h1>Welcome to Other Component</h1>'
})

// create a new Vue instance and mount it to our div element above with the id of app
var vm = new Vue({
  el: '#app',
  data: {
    componentToUse: 'greeting'
  },
  methods: {
    handleOtherComponentEvent () {
        console.log('Hello World from other component listener')
    },
    handleGreetingComponentEvent () {
        console.log('Hello World from greeting component event listener')
    }
  },
  computed: {
    listeners () {
        if (this.componentToUse === 'greeting') {
        return {
            'some-event': this.handleOtherComponentEvent
        }
      } else if (this.componentToUse === 'other-component') {
        return {
            'some-greeting-event': this.handleGreetingComponentEvent
        }
      }

      return {}
    },
    attributes () {
        if (this.componentToUse === 'greeting') {
        return {
            'name': 'Hammerbot'
        }
      }

      return {}
    }
  }
});
 类似资料:
  • 编辑:我已经采取了一种不同的方法来解决这个问题:根据接受的答案,在上检索父组件中的动态子组件值。 我正在尝试让父组件发出一个Event/Observable,以便它的子动态组件在侦听这样的事件时触发一个动作。 我已经了解到,在动态组件中使用或修饰符是不可能的,所以... 这是我用例的大纲: 动态子组件由一组4个输入元素组成。(完成) 父组件具有按钮,用于添加动态子组件。此按钮可用于添加动态子组件的

  • Component映射是具有对另一个类的引用作为成员变量的类的映射。 我们已经看到这样的映射,同时有两个表并在映射文件中使用“set”元素。 现在我们将在映射文件中使用“component”元素,并使用单个表来保持类变量中包含的属性。 定义RDBMS表 (Define RDBMS Tables) 考虑一种情况,我们需要将员工记录存储在EMPLOYEE表中,该表具有以下结构 - create tab

  • 我正在按照NestJS文档创建事件发射器(文档链接)。当我运行代码时,我得到一个错误: [Nest]129586-16/06/2021,20:43:31[ExceptionHandler]this.eventEmitter.emit不是函数 这就是我的代码的样子: 我不确定我错过了什么。

  • Node中的许多对象都会发出事件,例如net.Server每次对等体连接它时都会发出一个事件,fs.readStream会在打开文件时发出事件。 发出事件的所有对象都是events.EventEmitter的实例。 EventEmitter类 正如我们在上一节中看到的,EventEmitter类位于events模块中。 可通过以下代码访问 - // Import events module var

  • 我使用三台机器和本指南在aws集群上设置了一个测试环境。 我在本地模式下测试了我的代码,并使用wirbelsturm创建了一个本地vagrant集群,这两种方法都能产生预期的结果。 当我现在向Web服务器提交代码时,我的喷口和所有的螺栓都是静默的。我的嘴读的是csv,我把它抄送给了灵气和我的主管。storm UI显示我的拓扑为活动的,并显示所有螺栓和我的喷口,但计数器不可见。主管没有已使用得员工.

  • 情节 所有批处理应用程序(基于Spring批处理)都必须部署到Jboss EAP [Enterprise Workload/Scheduling][Shell脚本] 问题 由于批处理作业是通过HTTPendpoint异步启动的,shell脚本如何获得批处理作业的执行结果