angular5 @viewChild @ContentChild ElementRef renderer2

@viewChild

作用一:选择组件内节点

<!--视图  -->
<div #mydiv><input></div>
// 选择
@ViewChild(\'mydiv\') mydiv: ElementRef

// 返回原生节点
let el = this.mydiv.nativeElement // 

// 使用原生方法
let ipt = el.querySelector(\'input\')





作用二:选择子组件可调用自组件内的函数


子组件:


@Component({ selector: \'user-profile\' })


export class UserProfile {


constructor() {}


sendData() { //send data }


}


当前组件


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


import { UserProfile } from \'../user-profile\';


@Component({ template: \'<user-profile (click)="update()"></user-profile>\', })


export class MasterPage {


// ViewChild takes a class type or a reference name string.


// Here we are using the type


@ViewChild(UserProfile) userProfile: UserProfile


constructor() { } ngAfterViewInit() {


// After the view is initialized,


  this.userProfile will be available this.update();


}


update() {


this.userProfile.sendData();


}


}


@ViewChild @ContentChild @ViewChildren @ContentChildren 又是什么

@ViewChild 选择组件模板内的节点

@ContentChild 选择当前组件引用的子组件 @ContentChild(组件名)

@ViewChildren 和 @ContentChildren 则为对应的复数

import { Component, ContentChild, AfterContentInit } from \'@angular/core\';
import { ChildComponent } from \'./child.component\';

@Component({
    selector: \'exe-parent\',
    template: `
      <p>Parent Component</p>  
      <ng-content></ng-content>
    `
})
export class ParentComponent implements AfterContentInit {
    @ContentChild(ChildComponent)
    childCmp: ChildComponent;

    ngAfterContentInit() {
        console.dir(this.childCmp);
    }
}
import { Component } from \'@angular/core\';

@Component({
    selector: \'exe-child\',
    template: `
      <p>Child Component</p>  
    `
})
export class ChildComponent {
    name: string = \'child-component\';
}
import { Component } from \'@angular/core\';

@Component({
  selector: \'my-app\',
  template: `
    <h4>Welcome to Angular World</h4>
    <exe-parent>
      <exe-child></exe-child>
    </exe-parent>
  `,
})
export class AppComponent { }


ContentChild 与 ViewChild 的异同点

相同点

  • 都是属性装饰器

  • 都有对应的复数形式装饰器:ContentChildren、ViewChildren

  • 都支持 Type<any>|Function|string 类型的选择器

不同点

  • ContentChild 用来从通过 Content Projection 方式 (ng-content) 设置的视图中获取匹配的元素

  • ViewChild 用来从模板视图中获取匹配的元素

  • 在父组件的 ngAfterContentInit 生命周期钩子中才能成功获取通过 ContentChild 查询的元素

  • 在父组件的 ngAfterViewInit 生命周期钩子中才能成功获取通过 ViewChild 查询的元素

renderer2

// 添加类
this.renderer2.addClass(el, \'active\')
// 移除了类
this.renderer2.removeClass(el, \'active\')
// 设置样式
this.renderer2.setStyle(el, \'height\', \'10px\')
// 移除样式
this.renderer2.removeStyle(el, \'height\')
// 设置属性
this.renderer2.setAttribute(el, \'data-id\', \'id\')
// 移除属性
this.renderer2.removeAttribute(el, \'data-id\')
// 设置值
this.renderer2.setValue(ipt, \'some str\')
// 监听事件
this.renderer2.listen(el, \'click\', (e)=>{console.log(e)}) //el|\'window\'|\'document\'|\'body\'

// 其他类似
createElement 创建元素
createComment 动态创建组件
createText 创建文本节点
destroyNode 销毁节点
appendChild 插入子节点
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