当前位置: 首页 > article >正文

Angular 中获取 DOM 节点的几种方法

文章目录

    • 1. 使用`@ViewChild`获取单个 DOM 节点
    • 2. 使用`@ViewChildren`获取多个 DOM 节点
    • 3. 使用`ElementRef`直接访问 DOM
    • 4. 使用`Renderer2`操作 DOM
    • 5. 总结

在 Angular 开发中,虽然框架鼓励我们通过组件和模板来操作 DOM,但在某些情况下,直接访问和操作 DOM 节点仍然是必要的。Angular 提供了多种方式来实现这一需求,本文将详细介绍几种常见的方法,帮助你在项目中灵活地获取和操作 DOM 节点。

1. 使用@ViewChild获取单个 DOM 节点

@ViewChild是 Angular 提供的一个装饰器,用于获取模板中某个特定的 DOM 元素或组件实例。它通常与ElementRef一起使用,以便直接操作 DOM。

示例代码

import { Component, ViewChild, ElementRef, AfterViewInit } from "@angular/core";@Component({selector: "app-example",template: ` <div #myDiv>这是一个div</div> `,
})
export class ExampleComponent implements AfterViewInit {@ViewChild("myDiv", { static: false }) myDiv: ElementRef;ngAfterViewInit() {console.log(this.myDiv.nativeElement); // 获取到的DOM元素this.myDiv.nativeElement.style.color = "red"; // 操作DOM}
}
  • 在模板中,通过#myDiv定义了一个本地变量。
  • 使用@ViewChild('myDiv')通过本地变量获取对应的 DOM 元素。
  • ElementRef提供了对原生 DOM 元素的访问。
  • ngAfterViewInit生命周期钩子中操作 DOM,确保 DOM 已经渲染完成
  • static 选项决定了 Angular何时解析和注入@ViewChild@ViewChildren 所指定的元素:
    • true: 当你需要在 ngOnInit 中访问 DOM 元素时,应该使用 static: true
    • false: 当你需要获取运行时动态生成的 DOM 元素,例如通过*ngIf*ngFor,应该使用 static: false

2. 使用@ViewChildren获取多个 DOM 节点

如果需要获取多个 DOM 节点,可以使用@ViewChildren。它与@ViewChild类似,但可以获取多个匹配的 DOM 元素。

示例代码

import {Component,ViewChildren,QueryList,ElementRef,AfterViewInit,
} from "@angular/core";@Component({selector: "app-example",template: ` <div *ngFor="let item of items" #myDivs>{{ item }}</div> `,
})
export class ExampleComponent implements AfterViewInit {@ViewChildren("myDivs") myDivs: QueryList<ElementRef>;items = ["第一项", "第二项", "第三项"];ngAfterViewInit() {this.myDivs.forEach((div: ElementRef, index: number) => {console.log(`第\${index + 1}个div:`, div.nativeElement);div.nativeElement.style.backgroundColor = "lightblue";});}
}
  • 使用@ViewChildren获取多个 DOM 节点时,它会返回一个QueryList,其中包含所有匹配的 DOM 元素。
  • QueryList是一个动态的查询列表,可以遍历操作每个 DOM 元素。

3. 使用ElementRef直接访问 DOM

ElementRef可以直接访问组件的根 DOM 元素。不过,这种方法通常不推荐,因为它违反了 Angular 的封装原则,但在某些特殊场景下仍然可以使用。

示例代码

import { Component, ElementRef, OnInit } from "@angular/core";@Component({selector: "app-example",template: ` <div>这是一个div</div> `,
})
export class ExampleComponent implements OnInit {constructor(private el: ElementRef) {}ngOnInit() {console.log(this.el.nativeElement); // 获取组件的根DOM元素this.el.nativeElement.querySelector("div").style.color = "green";}
}
  • 通过constructor注入ElementRef,可以直接访问组件的根 DOM 元素。
  • 这种方法虽然可以直接操作 DOM,但不推荐使用,因为它可能导致代码难以维护。

4. 使用Renderer2操作 DOM

Angular 推荐使用Renderer2来操作 DOM,而不是直接操作ElementRefRenderer2提供了一种安全的操作 DOM 的方式,避免了直接操作 DOM 可能带来的问题。

示例代码

import { Component, Renderer2, ElementRef, OnInit } from "@angular/core";@Component({selector: "app-example",template: ` <div #myDiv>这是一个div</div> `,
})
export class ExampleComponent implements OnInit {@ViewChild("myDiv", { static: true }) myDiv: ElementRef;constructor(private renderer: Renderer2) {}ngOnInit() {this.renderer.setStyle(this.myDiv.nativeElement, "color", "blue");}
}
  • Renderer2提供了setStyleaddClass等方法来安全地操作 DOM。
  • 使用Renderer2操作 DOM 是 Angular 推荐的方式,更符合框架的设计原则。

5. 总结

在 Angular 开发中,有多种方式可以获取和操作 DOM 节点。@ViewChild@ViewChildren是获取 DOM 节点的常用方法,而Renderer2则是推荐的操作 DOM 的方式。尽量避免直接操作ElementRef,除非确实必要。

相关文章:

Angular 中获取 DOM 节点的几种方法

文章目录 1. 使用ViewChild获取单个 DOM 节点2. 使用ViewChildren获取多个 DOM 节点3. 使用ElementRef直接访问 DOM4. 使用Renderer2操作 DOM5. 总结 在 Angular 开发中&#xff0c;虽然框架鼓励我们通过组件和模板来操作 DOM&#xff0c;但在某些情况下&#xff0c;直接访问和…...

索引的优缺点与常见类型详解

索引是数据库优化的核心工具&#xff0c;但盲目使用可能适得其反。本文将系统梳理索引的缺点、常见类型及适用场景&#xff0c;助你避开常见陷阱。 一、索引的缺点 虽然索引能加速查询&#xff0c;但并非“免费午餐”&#xff0c;需警惕以下代价&#xff1a; 1. 存储空间开销…...

DeepSeek 提示词:定义、作用、分类与设计原则

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

ubuntu环境编译ffmepg支持nvidia显卡加速

文章目录 1. 安装NVIDIA驱动2. 安装CUDA&NV-CODEC2.1 安装CUDA2.2 安装NV-CODEC 3. 编译ffmpeg3.1 安装依赖3.2 下载源码安装依赖3.3 验证 4. 使用 1. 安装NVIDIA驱动 安装依赖包 sudo apt install -y ubuntu-drivers-common编辑 /etc/modprobe.d/blacklist-nouveau.conf 文…...

淘宝商品评论API调用教程:轻松获取用户评价数据(含测试Key)

在电商开发中&#xff0c;用户评价数据是优化产品和提升用户体验的重要依据。淘宝提供了商品评论API&#xff0c;方便开发者获取商品的用户评价信息。本文将详细介绍如何调用淘宝商品评论API&#xff0c;并附上测试Key供调试使用。 一、准备工作 注册淘宝开放平台账号 前往注册…...

边缘安全加速(Edge Security Acceleration)

边缘安全加速&#xff08;Edge Security Acceleration&#xff0c;简称ESA&#xff09;是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方&#xff0c;通常是在网络的边缘&#xff0c;而不是将所有流…...

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…...

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw&#xff1a;原始的、未经处理的图像数据。 /camera/image_rect&#xff…...

破解Docker镜像拉取难题:为Docker配置代理加速镜像拉取

为Docker配置代理加速镜像拉取 概述守护进程配置&#xff08;推荐长期使用&#xff09;Systemd环境变量配置&#xff08;适合临时调整&#xff09;其他 概述 为什么需要配置代理与镜像加速? 跨国网络限制&#xff1a;境外镜像仓库拉取速度慢或无法访问企业安全策略&#xff…...

细分数字货币钱包的不同种类

文章目录 一、中心化钱包1.1 中心化钱包架构1.2 中心化钱包业务细节流程 二、去中心化钱包(HD 钱包)2.1 去中心化钱包架构2.2 去中心化钱包细节业务流程 三、硬件钱包3.1 硬件钱包架构3.2 硬件钱包细节业务流程 四、MPC 托管钱包五、多签钱包 中心化钱包 &#xff1a;钱包私钥一…...

推理模型时代:大语言模型如何从对话走向深度思考?

一、对话模型和推理模型的区别概述 对话模型是专门用于问答交互的语言模型,符合人类的聊天方式,返回的内容可能仅仅只是一个简短的答案,一般模型名称后面会带有「chat」字样。 推理模型是比较新的产物,没有明确的定义,一般是指输出过程中带有<think>和</think&…...

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...

关于ES中text类型时间字段范围查询的结构化解决方案

前言 有关es中text类型的时间字段范围查询的问题&#xff0c;比如&#xff1a; {"query": {"range": {"insertTime": {"gte": "2025-02-01T00:00:00","lte": "2025-11-30T23:59:59","format&quo…...

易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR

原文&#xff1a;ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性&#xff5c;NAR 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下&#xff0c;生物体会通过调整…...

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器(Locators)2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架)总结前言 JetBrains 的 Aqua IDE 提供强大的 Web Inspector 工具,帮…...

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...

01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片

为了获取训练所需的图片,我们最常用的手段就是自己去写一个爬虫去获取相关图片。本文将重点围绕如何采用爬虫的方式获取训练所需的图片素材进行讲解,为了大家能够够直观的掌握相关技术,参考本文的相关过程和代码获取自己的数据图片素材,笔者将详细介绍实现过程。 1、确定图…...

【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记

本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码&#xff0c;当执行 addLast() 与 getLast() 方法时需要遍历链表&#xff0c;效率不高&#xff0c;因此可以添加一个指向链表末尾的索引&am…...

Git 工作流程

1、Git 工作流程 http://www.ruanyifeng.com/blog/2015/12/git-workflow.html git push -f origin HEAD^:master 删除服务器上最近的一次提交git push -f origin HEAD^:master 2、Git分支管理 动画形式演示分支效果&#xff1a; http://onlywei.github.io/explain-git-with-…...

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…...

【后端】gitHub访问速度太慢解决办法

问题描述 浏览器无法打开GitHub&#xff0c;加载非常慢 解决方法 1、修改本地hosts文件&#xff0c;增加到 http://github.global.ssl.fastly.net 和 http://github.com 的映射 本机hosts 文件位置&#xff1a; C:\Windows\System32\drivers\etc配置如下&#xff1a; # g…...

Hutool - Extra:功能丰富的扩展模块

一、简介 Hutool - Extra 作为 Hutool 工具包的扩展模块&#xff0c;对众多第三方库和功能进行了封装&#xff0c;极大地丰富了 Hutool 的功能体系。它涵盖了模板引擎、邮件发送、Servlet 处理、二维码生成、Emoji 处理、FTP 操作以及分词等多个方面&#xff0c;为开发者在不同…...

opencv实时二维码识别的一种实现与思路分享

在嵌入式平台上比如 rk3568 这种弱鸡的平台,要做到实时视频处理就非常鸡肋,不像英伟达那种 deepstrem 什么的。 开始的时候,我们使用python 下的 pyzbar + opencv opencv 读取摄像头的数据然后每帧送到 pyzbar 二维码识别函数里面进行处理,然后打印出识别的数字。结果,非常…...

深入剖析Linux C中线程未释放问题

深入剖析 Linux C 中线程未释放问题 在 Linux C 编程中&#xff0c;线程的正确使用对于程序的性能和稳定性至关重要。其中&#xff0c;线程资源的释放是一个容易被忽视但又极为关键的环节。本文将通过具体代码示例&#xff0c;深入探讨线程未释放的问题&#xff0c;并结合进程…...

个人博客5年回顾

https://huangtao01.github.io/ 五年前&#xff0c;看程序羊的b站视频做的blog&#xff0c;受限于网络&#xff0c;只能单向学习&#xff0c;没有人指导与监督&#xff0c;从来没有想过&#xff0c;有没有什么问题&#xff1f; 一、为什么要做个人博客&#xff1f; 二、我是怎么…...

nacos编写瀚高数据库插件

1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...

【编程语言】委托与函数指针

委托与函数指针的相似之处&#xff1a; 指向方法&#xff1a;C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法&#xff1a;它们都可以通过引用&#xff08;委托或函数指针&#xff09;来调用指向的方法。 委托与函数指针的主要区别&#xff1a; 类型安全&am…...

《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用

专栏简介 《Python实战进阶》专栏共68集&#xff0c;分为 模块1&#xff1a;Web开发与API设计&#xff08;共10集&#xff09;&#xff1b;模块2&#xff1a;数据处理与分析&#xff08;共10集&#xff09;&#xff1b;模块3&#xff1a;自动化与脚本开发&#xff08;共8集&am…...

Redis三剑客解决方案

文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透 缓存穿透的概念 每一次查询的 key 都不在 redis 中&#xff0c;数据库中也没有。 一般都是属于非法的请求&#xff0c;比如 id<0&#xff0c;比如可以在 API 入口做一些参数校验。 大量访问不存…...