原文链接

Understanding ViewChildren, ContentChildren, and QueryList in Angular

使用场景

有时候,我们想要在父组件中访问它的子组件。在Angular中可以使用ViewChildren ViewChild ContentChildren 来实现对子组件的访问。

假设,我们封装了一个Alert子组件

// alert.component.html
<h1 (click)="alert()">{{type}}</h1>
import { Component, OnInit, Input } from '@angular/core';

@Component({
selector: 'app-alert',
templateUrl: './alert.component.html',
styleUrls: ['./alert.component.scss']
})
export class AlertComponent implements OnInit { @Input() type = 'success';
constructor() { } ngOnInit() {
} alert() {
console.log('alert');
} }

然后,在HomeComponent 使用它多次

// home.component.html
<app-alert></app-alert>
<app-alert type="info"></app-alert>
<app-alert type="danger"></app-alert>

ViewChildren

使用 @ViewChildren decorator 来获取所有的子组件。@ViewChildren 支持的参数包括 directivecomponent type 和 模板变量。

// home.component.js

export class HomeComponent implements OnInit, AfterViewInit {
@ViewChildren(AlertComponent) alerts: QueryList<AlertComponent>; ngAfterViewInit() {
console.log(this.alerts);
this.alerts.forEach(alertInstance => console.log(alertInstance));
}
}

控制台打印出了3个AlertComponent的instance 对象

@ViewChildren的参数是 component 或者 directive时,会返回component 或者 directive的实例对象。

@ViewChildren的参数是模板变量时,会分两种情况。如果模板变量对应的是一个component,则返回实例对象;如果模板变量对应的是一个普通html标签,则返回本地元素的引用 ElementRef

// home.component.html
<div class="col" #div>
<app-alert #alert1></app-alert>
<app-alert type="info"></app-alert>
<app-alert type="danger"></app-alert>
</div>
// home.component.ts
export class HomeComponent implements OnInit, AfterViewInit {
@ViewChildren('alert1') alerts: QueryList<any>;
@ViewChildren('div') div: QueryList<any>; ngAfterViewInit() {
console.log(this.div);
this.div.forEach(inst => console.log(inst));
console.log(this.alerts);
this.alerts.forEach(alertInstance => console.log(alertInstance));
}
}

需要注意的是:如果使用了 *ngIf 来控制子组件是否显示,只有在子组件显示的时候,才能够获取到子组件。

ViewChild

如果在父组件中只有一个子组件,使用@ViewChild比较合适。

// home.component.ts
export class HomeComponent implements OnInit, AfterViewInit {
@ViewChild('alert1') alerts: any;
@ViewChild('div') div: any; ngAfterViewInit() {
console.log(this.div);
console.log(this.alerts);
}
}

read 参数

ElementRef

如果不想获取子组件的实例,只想访问Dom元素,可以添加read参数

// home.component.ts
@ViewChild('alert1', {read: ElementRef}) alerts: any;

@ViewChildren也支持read 参数。

ViewContainerRef

You need this token when you need to create templates or components dynamically。当需要动态创建组件时,需要这个参数。

  @ViewChildren(AlertComponent, {read: ViewContainerRef}) alerts: QueryList<AlertComponent>;

Angular5 父组件获取子组件实例( ViewChildren、ViewChild用法)的更多相关文章

  1. Vee-validate 父组件获取子组件表单校验结果

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  2. 子组件获取父组件数据 propsDown, 父组件获取子组件数据 eventUp

    (一) popsDowm 三种方法获取父组件数据:被动获得(1):主动获取(2). 1.被动获得: 父组件:v-bind: 绑定变量参数和方法参数:子组件:props 接收参数.可以在模板中直接使用也 ...

  3. vue父组件获取子组件页面的数组 以城市三级联动为例

    父组件调用子组件 <Cselect ref="registerAddress"></Cselect> import Cselect from '../../ ...

  4. 关于Vue中,父组件获取子组件的数据(子组件调用父组件函数)的方法

    1. 父组件调用子组件时,在调用处传给子组件一个方法 :on-update="updateData"   2. 子组件在props中,接收这个方法并声明 props: { onUp ...

  5. React Hook父组件获取子组件的数据/函数

    我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用.文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hoo ...

  6. antd 父组件获取子组件中form表单的值

    还是拿代码来讲吧,详情见注释 子组件 import React, { Component } from 'react'; import { Form, Input } from 'antd'; con ...

  7. vue 的父组件和子组件互相获取数据和方法

    父组件主动获取子组件的数据和方法 一.ref(但不能实时更新获取) 1.调用子组件的时候 定义一个ref <child ref="headerChild"></c ...

  8. vue3 template refs dom的引用、组件的引用、获取子组件的值

    介绍 通过 ref() 还可以引用页面上的元素或组件. DOM 的引用 <template> <div> <h3 ref="h3Ref">Tem ...

  9. vue:父子组件间通信,父组件调用子组件方法进行校验子组件的表单

    参考: ElementUI多个子组件表单的校验管理:https://www.jianshu.com/p/541d8b18cf95 Vue 子组件调用父组件方法总结:https://juejin.im/ ...

随机推荐

  1. http学习--常用请求方法和响应状态码

    常用的http请求方法: GET方法:请求服务器资源,并返回 POST方法:向指定资源提交数据进行处理请求(比如说表单,上传文件等).数据被包含在请求体中.POST请求可能会导致新的资源建立或已有资源 ...

  2. js-10s倒计时后关闭窗口

    效果: html: <h1 id="h1">10s后关闭窗口</h1> <a id="a1">启动</a> js ...

  3. spring boot 项目打包后无法通过命令行传入参数

    java -jar .\tk-provider.jar --spring.profiles.active=test 本想用测试环境的配置文件运行项目可项目启动时一直是使用dev配置文件运行. java ...

  4. Haystack全文检索框架

    一.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...

  5. Ubuntu访问samba共享文件方法

    1.1  安装samba客户端 sudo apt-get install smbclient -y 1.2  查看文件共享权限 smbclient -L //192.168.100.6 1.3  创建 ...

  6. R_Studio(教师经济信息)逻辑回归分析的方法和技巧

    使用R语言对"教师经济信息"进行逻辑回归分析 (1)按3:1的比例采用简单随机抽样方法,创建训练集和测试集 (2)用训练集创建逻辑回归模型 (3)用测试集预测贷款结果,并用tabl ...

  7. 设置centos7界面语言为中文

    1.在终端中输入命令 vim ~/.bashrc 来编辑“.bashrc”文件 2.在最后添加“ export LANG="zh_CN.UTF-8"  ” 3.执行 sudo sh ...

  8. 并发编程--Concurrent-工具类介绍

    并发编程--Concurrent-工具类介绍 并发编程--Concurrent-工具类介绍 CountDownLatch CylicBarrier Semaphore Condition 对象监视器下 ...

  9. 上传本地文件到linux

    Linux 命令行上传文件 Linux服务器,硬盘坏了,更换硬盘后,重装了好像是Foreda v22的操作系统,我在/var/www/html/目录下新建了我的个人文件夹 kma,然后我在此kma文件 ...

  10. Hadoop之集群搭建

    准备 需要准备多台主机(已经安装并且配置好hadoop和jdk) 需要配置ssh免密服务 下面我们开始进行配置,拿到已经准备好的主机,主机名分别为: centos101 centos102 cento ...