浅谈Angular中@ViewChild的用法

1 前置知识学习

@ViewChild是Angular一共提供的内置的装饰器

Angular提供的内置装饰器分为:类装饰器、属性装饰器、方法装饰器和参数装饰器

@ViewChild属于属性装饰器的一个

ViewChild 用来从模板视图中获取匹配的元素。视图查询在 ngAfterViewInit 钩子函数调用前完成,因此在 ngAfterViewInit 钩子函数中,才能正确获取查询的元素。

@Input() username:string;
// @Input()这个装饰器用来对username进行操作,将父组件中传下来的值username赋值给username这个属性

// 当然我们还可以自定义一些属性装饰器。比如在下面实现的@Emoji(),这就是一个属性装饰器。

2 @ViewChild学习梳理

2.1 @ViewChild作用是什么
  • @ViewChild是Angular提供的用来从模板视图中获取匹配元素的一个属性装饰器。 用于配置一个视图查询。
  • 变更检测器会在视图的 DOM 中查找能匹配上该选择器的第一个元素或指令。
  • 如果视图的 DOM 发生了变化,出现了匹配该选择器的新的子节点,该属性就会被更新。
2.2 @ViewChild的参数说明
// 将查询到的第一个元素或者指令赋值给selector
@ViewChild('searchText', {read: ElementRef, static: false})  selector; 
2.2.1 read: 告诉@ViewChild你返回的是什么类型的数据
// 我想通过#myname去查询原始,并将返回ViewContainerRef类型
@ViewChild('myname', {read: ViewContainerRef}) target; 
  • read参数是可选的,因为 Angular 会根据 DOM 元素的类型推断出该引用类型。 一般Angular会推断出一些比较简单的类型如: ElementRef 、 TemplateRef
  • 一些引用类型如 ViewContainerRef 就不可以被 Angular 推断出来,所以必须在 read 参数中显式声明

一个字符串, 如果没有提供read参数确切的告知返回的元素是什么类型,则其返回实例类型按照以下顺序:

  • ElementRef实例, : (对于每个元素,都有一个ElementRef和ViewContainerRef)
  • 如果没有对应的ElementRef, 则匹配同名的组件
2.2.1 static

…(还不确定后续再补)

3 @ViewChild的使用

3.1 获取本html页面DOM元素
html
<input type="text" #myInput>

ts
方法一:
import { ViewChild, ElementRef } from '@angular/core';

@ViewChild('myInput') input;  ==> @ViewChild('myInput') input: ElementRef;
ngAfterViewInit() {
    console.dir(this.input);
} 

this.input.nativeElement.focus();  // 获取焦点
3.2 通过@ViewChild获取子组件,得到子组件的值、调用子组件的方法

子组件child

content:'Zita';

changeChildCon() {
    this.content = 'Zita1111'
}

父组件parent:

html
<app-child #ChildrenView></app-child>

ts
import { ViewChild } from '@angular/core';
@ViewChild('ChildrenView', { static: true }) aaaChildrenView: any;  
//ChildrenView为子组件中的#后边的值,aaaChildrenView是个名称用来指代子组件

this.childrenView.content   // Zita  获取子组件中的值
this.childrenView.changeChildCon()  // 执行子组件中的方法
this.childrenView.content   // Zita1111
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMSI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值