@ViewChild 的三种常用方法

本文介绍了在 Angular 中如何进行 DOM 操作,包括通过 ViewChild 获取元素并修改其内容和样式。同时,展示了如何通过 ViewChild 访问子组件的方法以及通过直接注入子组件来调用其属性和方法,实现父组件与子组件间的交互。
//--1------ 在angular中进行dom操作
<div #dom>这是一个div</div> //放置一个锚点dom

import { ElementRef, ViewChild } from '@angular/core';

@ViewChild('dom',{static:true}), eleRef:ElementRef;
//static-True表示在运行更改检测之前解析查询结果,false用于在更改检测后解析。默认为false。

// dom 操作需要在ngAfterViewInit()中进行
// ViewChild会在ngAfterViewInit()回调函数之前做完工作,也就是说你不能在构造函数中使用这个元素。
ngAfterViewInit(){
    let attr = this.eleRef.nativeElement;
    console.log(attr) //<div>这是一个div<div>
    attr.innerHTML = "@ViewChild的dom操作";
    attr.color = "red";
    console.log(attr) //<div>@ViewChild的dom操作<div>
}

//--2-------通过放置锚点获取子组件中的方法和属性
//在子组件中有一个run方法

<app-test-it #header></app-test-it> //在父组件中引入子组件并放置一个锚点 header
<button (click)="getSonFn()">点击获取子组件里面的方法</button>

import {ElementRef,ViewChild} from "angular/core";

@ViewChild('header',{static:true}), my:any;

getSonFn(){ //这是一个点击方法,点击调用这个方法。
    this.my.run();
}

//--3------通过父组件中注入子组件以获取子组件中的方法和属性
//子组件中:
<p>{{number}}</p>

number:number = 0
addNumber(){
    this.number++
}

//父组件中:
<button (click)="upCount()">number++</button>
<button (click)="downcount()">number--</button>
<app-test-it></app-test-it> //该子组件

import {ViewChild} from @angular/core;
import {TestItComponent} from './test/test-it.component";//引入子组件

@ViewChild('TestItComponent',{static: ture}) son:TestItComponent; 
  // 核心代码:用于查询子组件,并在本地创建的子组件对象 childcomponent 红注入相同属性。父组件同样有两个方法,自增和自减。

upCount(){
    this.son.addNumber();
}
downCount(){
    this.son.number--;
}

 

在 Angular 中,@ViewChild 是一个属性装饰器,用于从模板视图中获取匹配的元素或指令,以下是关于它的详细使用方法: ### 基本作用 @ViewChild 允许开发者通过代码更直接地操作视图,从而实现更复杂、更灵活的交互效果。它用于配置一个视图查询,变更检测器会在视图的 DOM 中查找能匹配上该选择器的第一个元素或指令。如果视图的 DOM 发生了变化,出现了匹配该选择器的新的子节点,该属性就会被更新[^1][^2]。 ### 参数说明 - **read**:告诉 @ViewChild 返回的是什么类型的数据。一般 Angular 会推断出一些比较简单的类型,如 ElementRef、TemplateRef,而一些引用类型如 ViewContainerRef 则不能被 Angular 推断出来,所以必须在 read 参数中显式声明。例如: ```typescript // 将查询到的第一个元素或者指令赋值给 selector @ViewChild('searchText', { read: ElementRef, static: false }) selector; // 通过 #myname 去查询元素,并返回 ViewContainerRef 类型 @ViewChild('myname', { read: ViewContainerRef }) target; ``` - **static**:该参数为布尔值。如果设置为 `true`,则在 ngOnInit 钩子函数中就可以获取查询的元素;如果设置为 `false`(默认值),则需要在 ngAfterViewInit 钩子函数中才能正确获取查询的元素。视图查询在 ngAfterViewInit 钩子函数调用前完成。 ### 获取元素的时机 通过 @ViewChild 获取元素时,一定要在 `ngAfterViewInit()` 生命周期函数中获取,即页面组件加载完成之后,或者设置 `@ViewChild("XX", { static: true })`,否则无法获取元素。例如: ```typescript import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; @Component({ selector: 'app-example', template: '<input #searchText type="text" />' }) export class ExampleComponent implements AfterViewInit { @ViewChild('searchText', { static: false }) searchInput: ElementRef; ngAfterViewInit() { // 在 ngAfterViewInit 中可以正确获取元素 console.log(this.searchInput.nativeElement.value); } } ``` ### 获取子组件实例 在父组件中,可以使用 @ViewChild 获取子组件的实例,从而调用子组件的属性和方法。例如: 父组件 `parent.html`: ```html <app-child #ChildrenView></app-child> ``` 父组件 `parent.ts`: ```typescript import { Component, ViewChild } from '@angular/core'; import { ChildComponent } from './child.component'; @Component({ selector: 'app-parent', templateUrl: './parent.html' }) export class ParentComponent { @ViewChild('ChildrenView', { static: true }) childrenView: ChildComponent; ngOnInit() { // 可以访问子组件的属性和方法 console.log(this.childrenView.content); // 访问子组件的属性 this.childrenView.changeChildCon(); // 调用子组件的方法 } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yusirxiaer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值