在使用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(private el:ElementRef){}
setHeight(){
this.el.nativeElement.querySelector('.btn1').style.height = '300px';
}
ngOnInit(){
this.setHeight();
}
}
<h1>
{{title}}
</h1>
<div>
<button myHighlight class="btn btn1">按钮一</button>
<button myHighlight class="btn">按钮二</button>
<button myHighlight class="btn">按钮三</button>
</div>
效果是这样:
上述代码中的nativeElement其实包含的是组件中所有的DOM元素,如下图所示:
通过调用querySelectorAPI就能获取页面元素,需要注意的是querySelector只返回第一个元素,当你需要选择多个元素的时候可以使用querySelectorAll。
通过@viewChild
<h1>
{{title}}
</h1>
<div>
<button myHighlight class="btn btn1">按钮一</button>
<button myHighlight class="btn" #btn>按钮二</button> <!--增加一个变量-->
<button myHighlight class="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(private el: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(private el:ElementRef,private renderer2: 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。
renderer2API中还有其他的一些方法可以用来进行一些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元素
# angular
# 获取dom元素
# angular2
# dom元素
# Angular ViewChild组件间通信demo
# Angular 2父子组件数据传递之@ViewChild获取子组件详解
# Angular父组件调用子组件的方法
# AngularJS实现DOM元素的显示与隐藏功能
# 在 Angular 中使用 ViewChild 访问子组件、
# 的是
# 多个
# 第一个
# 就能
# 有可能
# 是这样
# 当你
# 其他的
# 掉了
# 可以使用
# 所示
# 中都
# 经常会
# 需要注意
# 到第
# 大家多多
# 如下图
# 可以用来
# 变成了
# 应用层
相关文章:
代刷网站制作软件,别人代刷火车票靠谱吗?
制作网站外包平台,自动化接单网站有哪些?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
威客平台建站流程解析:高效搭建教程与设计优化方案
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
网站制作软件有哪些,制图软件有哪些?
c# 在ASP.NET Core中管理和取消后台任务
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
建站168自助建站系统:快速模板定制与SEO优化指南
微信h5制作网站有哪些,免费微信H5页面制作工具?
建站之星如何助力网站排名飙升?揭秘高效技巧
如何快速生成高效建站系统源代码?
如何快速生成凡客建站的专业级图册?
建站之星如何一键生成手机站?
如何快速使用云服务器搭建个人网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Swift开发中switch语句值绑定模式
阿里云网站制作公司,阿里云快速搭建网站好用吗?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在阿里云域名上完成建站全流程?
建站之星后台管理:高效配置与模板优化提升用户体验
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
大同网页,大同瑞慈医院官网?
建站之星代理平台如何选择最佳方案?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何将凡科建站内容保存为本地文件?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
建站主机选哪种环境更利于SEO优化?
定制建站是什么?如何实现个性化需求?
如何快速搭建安全的FTP站点?
如何用狗爹虚拟主机快速搭建网站?
如何用西部建站助手快速创建专业网站?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
,交易猫的商品怎么发布到网站上去?
css网站制作参考文献有哪些,易聊怎么注册?
建站之星好吗?新手能否轻松上手建站?
招商网站制作流程,网站招商广告语?
建站主机选虚拟主机还是云服务器更好?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
广州商城建站系统开发成本与周期如何控制?
如何撰写建站申请书?关键要点有哪些?
建站之星如何防范黑客攻击与数据泄露?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
,sp开头的版面叫什么?
建站之星24小时客服电话如何获取?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何选择PHP开源工具快速搭建网站?
如何在Tomcat中配置并部署网站项目?
*请认真填写需求信息,我们会在24小时内与您取得联系。