详解如何在Angular中快速定位DOM元素


Posted in Javascript onMay 17, 2017

在使用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>

效果是这样:

详解如何在Angular中快速定位DOM元素

上述代码中的nativeElement其实包含的是组件中所有的DOM元素,如下图所示:

详解如何在Angular中快速定位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();
 }
}

效果如下:

详解如何在Angular中快速定位DOM元素

如果多个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选择元素,但是在Angular4renderer已经废弃掉了,变成了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
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
JSON 客户端和服务器端的格式转换
Aug 27 Javascript
javascript 三种编解码方式
Feb 01 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
分享jQuery网页元素拖拽插件
Dec 01 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 Javascript
JS原生带小白点轮播图实例讲解
Jul 22 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
微信小程序开发实现消息推送
Nov 18 Javascript
浅析Vue下的components模板使用及应用
Nov 27 Javascript
JavaScript实现英语单词题库
Dec 24 Javascript
vue2.0中goods选购栏滚动算法的实现代码
May 17 #Javascript
AngularJS自定义指令实现面包屑功能完整实例
May 17 #Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
May 17 #jQuery
AngularJS使用拦截器实现的loading功能完整实例
May 17 #Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 #Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 #Javascript
bootstrap轮播图示例代码分享
May 17 #Javascript
You might like
Protoss兵种介绍
2020/03/14 星际争霸
教你如何把一篇文章按要求分段
2006/10/09 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
基于JavaScript实现的折半查找算法示例
2017/04/14 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
毕业自我评价范文
2013/11/17 职场文书
微笑服务演讲稿
2014/05/13 职场文书
《观潮》教学反思
2016/02/17 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
vue实现列表垂直无缝滚动
2022/04/08 Vue.js