Angular 中 @ViewChild 与 @ContentChild 的区别

博客介绍了Angular组件交互中,组件镶嵌的两种方式,即创建父组件时将子组件写在模版中,以及子组件通过投影方式嵌入父级组件。若要访问子组件公开属性或方法,需使用特定装饰器,并给出实例,还提醒获取子组件实例需在OnInit阶段及之后。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

在组件交互中,组件之间的镶嵌一般有两种方式:

  1. 在创建父组件时将子组件直接写在模版中。
  2. 子组件通过投影方式嵌入父级组件,通过 ng-content 形式。

在这两种情况下,如果我们需要访问子组件的公开属性或方法,就需要使用 @ViewChild@ContentChild 装饰器了。他们依次代表上面的两种情况,具体使用如下。

实例

对于第一种(@ViewChild()):


// template
<app-list></app-list>

// ts
// 父组件
@Component({
    selector: 'app-list',

    // 子组件,定义在组件内
    template: `
        <app-list-item></app-list-item>
    `
})
export class ListComponent implements OnInit {

    // 通过 @ViewChild 装饰器声明子组件
    @ViewChild(TreeListComponent) listItem: TreeListComponent;

    // 在 OnInit 阶段获取子组件的实例
    ngOnInit() {

        // 即这里可以使用子组件实例公开的变量与方法
        console.log(this.listItem);
    }
}

第二种形式(@ContentChild()):


// template
<app-list>
    <app-list-item></app-list-item>
</app-list>

// ts
// 父组件
@Component({
    selector: 'app-list',

    // 子组件,通过投影方式嵌入
    template: `
        <ng-content></ng-content>
    `
})
export class ListComponent implements OnInit {

    // 通过 @ContentChild 装饰器声明嵌入的组件
    @ContentChild(TreeListComponent) listItem: TreeListComponent;

    // 在 OnInit 阶段获取子组件的实例
    ngOnInit() {

        // 即这里可以使用嵌入的组件实例公开的变量与方法
        console.log(this.listItem);
    }
}

注意:如果需要子组件的实例,需在 OnInit 阶段及之后才能获取到。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值