angular8 实现动态 加载组件

-----------------------------2022年0409更新------------------------

源码下载:angular8实现动态加载组件-Javascript文档类资源-CSDN下载

同时官方最新文档里面,有一篇也说到了动态加载组件 

动态组件加载器

-----------------------------------原文----------------------------------------

    业务场景: 动态数据源的tab切换框(tab的个数、名称、里面的内容是 动态的)。
    场景说明: ① 用户通过前台交互, 增加/删除某一类型的tab标签页, 
                         ② 将tab标签页的变化存储到后台 
                         ③ 从后台拿到新的tab标签页数据以后,渲染为 tab切换框。(这里只讨论③的实现)
   注意:
                ①   实现动态加载组件,最重要的3个部分:viewchild,viewContainerRef , componentFactoryResolver
                ②   angular8 中viewchild 需要2个参数,一个是模板变量的名称,另一个一般默认是{  static:false }  

  代码部分:
        目录结构(因为是个demo,所以结构比较简单,dynamic-tab-set组件就是动态加载组件的 tab切换框组件。dy1和dy2组件没什么东西,就是2个简单的初始化组件)

          

         dynamic-tab-set.component.ts (为了方便演示,数据源就是假设的数据源 。dy1/2 既是需要加载的组件名,又是tab按键名,即tab的个数,名称,加载的内容是动态的,由后台数据源控制。)

//ViewChild 属性装饰器, 通过组件的模板变量,来获取组件元素。(可用作父子间组件通信的方式)
//ViewContainerRef 视图容器,在里面可以增,删组件
//ComponentFactoryResolver 动态加载组件的服务  
import { Component, OnInit, ViewContainerRef, ViewChild, ComponentFactoryResolver } from '@angular/core';

import { dynamicComponent } from '../dynamiModule';


@Component({
  selector: 'app-dynamic-tab-set',
  templateUrl: './dynamic-tab-set.component.html',
  styleUrls: ['./dynamic-tab-set.component.scss']
})
export class DynamicTabSetComponent implements OnInit {
  @ViewChild('componentContainer', { static: false, read: ViewContainerRef }) componentContainer: ViewContainerRef;

  //假设这是从后台拿取的数据。
  tabsData = [{
    name: 'dy1'
  }, {
    name: 'dy2'
  }]

  constructor(private cfr: ComponentFactoryResolver) { }

  ngOnInit() {
  }

  getDynamicComponents(name) {
    this.componentContainer.clear();
    let component = this.cfr.resolveComponentFactory(dynamicComponent[name]);
    this.componentContainer.createComponent(component);
  }

}

dynamic-tab-set.component.html 

<ng-container *ngIf="tabsData && tabsData.length > 0">
  <!-- tab键 -->
  <ng-container *ngFor="let tabData of tabsData">
    <button (click)="getDynamicComponents(tabData.name)">{{tabData.name}}</button>
  </ng-container>
  <!-- 组件容器  -->
  <div #componentContainer></div>
</ng-container>

dynamiModule.ts (由于 动态的组件,① 需要在当前module下 declarations数组中声明,②需要在当前module下 entryComponents数组中声明 ③ 需要在tab切换框页面 导入。 所以需要多次多个地方重复写import,太麻烦了)(参考文章)

import { Dy1Component } from './dy1/dy1.component';
import { Dy2Component } from './dy2/dy2.component';

const dynamicComponent = {
    'dy1': Dy1Component,
    'dy2': Dy2Component
}

const importComponents = [Dy1Component, Dy2Component];

export { dynamicComponent, importComponents }

app.component.html

 <app-dynamic-tab-set></app-dynamic-tab-set>

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

import { DynamicTabSetComponent } from './dynamic-tab-set/dynamic-tab-set.component';
import { importComponents } from './dynamiModule';


@NgModule({
  declarations: [
    AppComponent,
    DynamicTabSetComponent,
    [...importComponents]
  ],
  entryComponents: [
    [...importComponents],
  ],
  imports: [
    BrowserModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

  参考文章1    参考文章2

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个Angular动态组件示例,该组件可以根据输入的组件类型动态创建并显示组件: app.component.ts ``` import { Component, ViewChild, ViewContainerRef, ComponentFactoryResolver } from '@angular/core'; import { DynamicComponent } from './dynamic.component'; @Component({ selector: 'app-root', template: ` <div #container></div> <button (click)="createComponent('dynamic')">Create Dynamic Component</button> `, }) export class AppComponent { @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef; constructor(private resolver: ComponentFactoryResolver) {} createComponent(type: string) { // 根据组件类型获取组件工厂 const factory = this.resolver.resolveComponentFactory(DynamicComponent); // 创建组件实例 const componentRef = this.container.createComponent(factory); // 设置组件属性 componentRef.instance.type = type; } } ``` dynamic.component.ts ``` import { Component, Input } from '@angular/core'; @Component({ selector: 'app-dynamic', template: ` <div *ngIf="type"> Dynamic Component Type: {{ type }} </div> `, }) export class DynamicComponent { @Input() type: string; } ``` 在这个例子中,我们首先在`AppComponent`中使用`ViewChild`获取了一个`ViewContainerRef`引用,这个`ViewContainerRef`表示了一个可以动态组件的容器。然后,我们在`createComponent`方法中根据输入的组件类型获取了一个组件工厂,并使用`createComponent`方法创建了一个组件实例,并将其添到了容器中。最后,我们还在`DynamicComponent`中添了一个`Input`属性`type`,用于接收传递进来的组件类型。 使用这个动态组件的示例可以参考以下内容: ``` <app-root></app-root> ``` 在页面中添了一个按钮,当点击按钮时,会调用`AppComponent`中的`createComponent`方法创建一个`DynamicComponent`实例,并将其添到页面中的容器中。这个`DynamicComponent`实例会根据传递进来的组件类型显示不同的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值