动态渲染嵌套组件(在父组件中创建)作为指令

Posted

技术标签:

【中文标题】动态渲染嵌套组件(在父组件中创建)作为指令【英文标题】:Render a nested component dynamically (created in the parent component) as a directive 【发布时间】:2020-10-23 17:06:51 【问题描述】:

是否可以?

我知道我可以这样做:

    <svg>
      <svg:g skick-back-drop-item />
    </svg>

其中“skick-back-drop-item”是以下组件:

    @Component(
    selector: '[skick-back-drop-item]',
    templateUrl: './back-drop-item.component.html',
    styleUrls: ['./back-drop-item.component.scss'],
    )
    export class BackDropItemComponent implements OnInit 
    ...

但我想看看是否可以在父组件中创建/实例化该子组件,然后将其作为指令注入到任何 DOM 元素中,DOM 元素将是这样的:

    <svg>
      <svg:g #svgContainer/>
    </svg>

我正在使用 ComponentFactoryResolver 和 @angular/core 中的 ViewContainerRef 在父组件中动态创建子组件

     performFrame() 

      ....
     //Add nested component
      const factory = this.resolver.resolveComponentFactory(
        BackDropItemComponent
      );
      const componentRef = this.container.createComponent(factory);
      componentRef.instance.imagePath = objectUrl;
    
  

但这种方法会创建以下包装 div 容器:

    <div _nghost-hoc-c42="" skick-back-drop-item="" class="ng-star-inserted">

如果组件渲染为指令,则只渲染子组件的内容,这是我需要的,因为子组件包含 SVG 元素。如果添加了该包装器,则 SVG 不会呈现,因为 SVG 树中的那个奇怪的 div。

【问题讨论】:

【参考方案1】:

您可以删除主机或将其转换为有效的 svg --> 如下所示:Remove the host HTML element selectors created by angular component

【讨论】:

该帖子中的一个答案可以为我的问题提供解决方案,但是这个问题更侧重于在 DOM 中创建和注入组件作为指令。我对你的回答投了赞成票,但我会等着看是否有人提出另一种解决问题的方法。

以上是关于动态渲染嵌套组件(在父组件中创建)作为指令的主要内容,如果未能解决你的问题,请参考以下文章

Vue入门基础—— 动态组件&插槽&自定义指令

react组件之间传值方式

vue指令 v-bind 属性绑定 动态渲染组件

$编译动态组件

如何在 react.js 中创建动态网格?

Vue动态组件 & 插槽 & 自定义指令