内容简介:如何在Angular中快速定位DOM元素
在使用Angular2+中,经常会想快速的去选择DOM上的某个元素,如果是刚上手Angular,有可能直接就使用原生DOM操作或者导入jQuery再进行DOM操作,既然都使用了Angular了,有没有更好的方法呢?答案是肯定的。
通过ElementRef
先上代码:
import {Component, ElementRef, OnInit} from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit{ color:string; title = 'button !'; constructor(privateel:ElementRef){} setHeight(){ this.el.nativeElement.querySelector('.btn1').style.height = '300px'; } ngOnInit(){ this.setHeight(); } }
<h1> {{title}} </h1> <div> <buttonmyHighlightclass="btn btn1">按钮一</button> <buttonmyHighlightclass="btn">按钮二</button> <buttonmyHighlightclass="btn">按钮三</button> </div>
效果是这样:
上述代码中的 nativeElement
其实包含的是 组件 中所有的DOM元素,如下图所示:
通过调用 querySelector
API就能获取页面元素,需要注意的是 querySelector
只返回第一个元素,当你需要选择多个元素的时候可以使用 querySelectorAll
。
通过@viewChild
<h1> {{title}} </h1> <div> <buttonmyHighlightclass="btn btn1">按钮一</button> <buttonmyHighlightclass="btn"#btn>按钮二</button> <!--增加一个变量--> <buttonmyHighlightclass="btn">按钮三</button> </div>
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit{ @ViewChild('btn') btn:ElementRef;//通过@ViewChild获取元素 color:string; title = 'button !'; constructor(privateel:ElementRef){} setHeight(){ this.el.nativeElement.querySelector('.btn1').style.height = '300px'; } setWidth(){ this.btn.nativeElement.style.width = '200px';//定义宽度 } ngOnInit(){ this.setHeight(); this.setWidth(); } }
效果如下:
如果多个HTML元素都定义了相同的变量,使用 @viewChild
时只能选择到第一个元素。
更好的方法是配合 renderer2
对象提供的API去实现同样的效果,这样减少应用层与渲染层之间强耦合关系:
import {Component, ElementRef, OnInit, Renderer2, ViewChild} from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent implements OnInit{ @ViewChild('btn') btn:ElementRef; color:string; title = 'button !'; //初始化renderer2 constructor(privateel:ElementRef,privaterenderer2: Renderer2){} setHeight(){ this.el.nativeElement.querySelector('.btn1').style.height = '300px'; } setWidth(){ // this.btn.nativeElement.style.width = '200px'; //使用renderer2的setStyle方法设置宽度 this.renderer2.setStyle(this.btn.nativeElement,'width','200px') } ngOnInit(){ this.setHeight(); this.setWidth(); } }
参考文章中都提到了 @viewChild
配合 renderer
选择元素,但是在Angular4中 renderer
已经废弃掉了,变成了 renderer2
。
renderer2
API中还有其他的一些方法可以用来进行一些DOM操作:
class Renderer2 { data : {[key: string]: any} destroy() : void createElement(name: string, namespace?: string) : any createComment(value: string) : any createText(value: string) : any destroyNode : (node: any) => void | appendChild(parent: any, newChild: any) : void insertBefore(parent: any, newChild: any, refChild: any) : void removeChild(parent: any, oldChild: any) : void selectRootElement(selectorOrNode: string|any) : any parentNode(node: any) : any nextSibling(node: any) : any setAttribute(el: any, name: string, value: string, namespace?: string) : void removeAttribute(el: any, name: string, namespace?: string) : void addClass(el: any, name: string) : void removeClass(el: any, name: string) : void setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2) : void removeStyle(el: any, style: string, flags?: RendererStyleFlags2) : void setProperty(el: any, name: string, value: any) : void setValue(node: any, value: string) : void listen(target: 'window'|'document'|'body'|any, eventName: string, callback: (event: any) => boolean | void) : () => void }
参考文章
以上所述就是小编给大家介绍的《如何在Angular中快速定位DOM元素》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Selenium Webdriver元素定位的方式
- Selenium自动化测试之学会元素定位
- Python2+Selenium入门03-元素定位
- relative 和 absolute 元素的百分比定位
- 这些appium常用元素定位技巧,你掌握了几种?
- CSS进阶——绝对定位元素的宽高是如何定义的
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Clean Architecture
Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99
Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
正则表达式在线测试
正则表达式在线测试