Angular开发实践(七): 跨平台操作DOM及渲染器Renderer2

在《angular开发实践(六):服务端渲染》这篇文章的最后,我们也提到了在服务端渲染中需要牢记的几件事件,其中就包括不要使用window、 document、 navigator等浏览器特有的类型以及直接操作dom元素。

这样就引出了 Angular 主要特性之一:横跨所有平台。通过合适的方法,使用 Angular 构建的应用,可复用在多种不同平台的应用上 —— Web、移动 Web、移动应用、原生应用和桌面原生应用。

为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异。比如定义了抽象类 Renderer2 、抽象类 RootRenderer 等。此外还定义了以下引用类型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。通过 模板变量、@ViewChild 等方法获取DOM元素。

为了演示,先定义一个组件DemoComponent:

import { AfterViewInit, Component, ElementRef, Renderer2, ViewChild } from '@angular/core';@Component({    template: `        

this is p!

        p的id:{{demop.id}}     `})export class DemoComponent implements AfterViewInit {    @ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取    constructor(private renderer: Renderer2) {    }    ngAfterViewInit() {        console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop        this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color    }}

登录后复制登录后复制

获取组件中的p

在Angular应用中不应该通过原生 API 或者 jQuery 来直接获取DOM元素:

let element1 = document.getElementById("demop"); // jQuery获取: $('#demop')

登录后复制

而是应该通过Angular提供的方法来获取DOM元素:

模板变量

this is p!

p的id:{{demop.id}}

登录后复制登录后复制

在组件模板中,我们在 p 上定义了 #demop 的模板变量,那么 demop 就等于该 p 的 DOM 对象,因此我们可以通过 demop.id 直接获取 p 的 id。

@ViewChild

@ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取ngAfterViewInit() {    console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop}

登录后复制

在组件类中,我们通过 @ViewChild 获取到包装有 p 的 DOM 对象的 ElementRef 对象,ElementRef 定义如下:

class ElementRef {  constructor(nativeElement: T)  nativeElement: T}

登录后复制

因此我们可以在 ngAfterViewInit 中通过 this.demop.nativeElement 获取到该 p 的 DOM 对象,然后获取元素的id。

操作组件中的p

在上面通过几种方式获取到 p 的 DOM 对象,那么我们要如果对它进行操作呢(设置样式、属性、插入子元素等)?通过原始API 或者 jQuery 肯定是不允许的了。

这样我们就引出Angular抽象类 Renderer2 来对元素进行设置样式、属性、插入子元素等操作。

Renderer2 的定义如下:

class Renderer2 {    get data: {...}    destroyNode: ((node: any) => void) | null    destroy(): void    createElement(name: string, namespace?: string | null): any // 创建元素    createComment(value: string): any // 创建注释元素    createText(value: string): any // 创建文本元素    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 | null): void // 设置属性    removeAttribute(el: any, name: string, namespace?: string | null): 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 // 设置DOM对象属性,不同于元素属性    setValue(node: any, value: string): void // 设置元素值    listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void // 注册事件}

登录后复制登录后复制

因此,我们想改变 p 的背景色,就可以这样做:

ngAfterViewInit() {    this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color}

登录后复制登录后复制

                                               

在《Angular开发实践(六):服务端渲染》这篇文章的最后,我们也提到了在服务端渲染中需要牢记的几件事件,其中就包括不要使用window、 document、 navigator等浏览器特有的类型以及直接操作DOM元素。

这样就引出了 Angular 主要特性之一:横跨所有平台。通过合适的方法,使用 Angular 构建的应用,可复用在多种不同平台的应用上 —— Web、移动 Web、移动应用、原生应用和桌面原生应用。

为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异。比如定义了抽象类 Renderer2 、抽象类 RootRenderer 等。此外还定义了以下引用类型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。通过 模板变量、@ViewChild 等方法获取DOM元素。

为了演示,先定义一个组件DemoComponent:

import { AfterViewInit, Component, ElementRef, Renderer2, ViewChild } from '@angular/core';@Component({    template: `        

this is p!

        p的id:{{demop.id}}     `})export class DemoComponent implements AfterViewInit {    @ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取    constructor(private renderer: Renderer2) {    }    ngAfterViewInit() {        console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop        this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color    }}

登录后复制登录后复制

获取组件中的p

在Angular应用中不应该通过原生 API 或者 jQuery 来直接获取DOM元素:

let element1 = document.getElementById("demop"); // jQuery获取: $('#demop')

登录后复制

而是应该通过Angular提供的方法来获取DOM元素:

模板变量

this is p!

p的id:{{demop.id}}

登录后复制登录后复制

在组件模板中,我们在 p 上定义了 #demop 的模板变量,那么 demop 就等于该 p 的 DOM 对象,因此我们可以通过 demop.id 直接获取 p 的 id。

@ViewChild

@ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取ngAfterViewInit() {    console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop}

登录后复制

在组件类中,我们通过 @ViewChild 获取到包装有 p 的 DOM 对象的 ElementRef 对象,ElementRef 定义如下:

class ElementRef {  constructor(nativeElement: T)  nativeElement: T}

登录后复制

因此我们可以在 ngAfterViewInit 中通过 this.demop.nativeElement 获取到该 p 的 DOM 对象,然后获取元素的id。

操作组件中的p

在上面通过几种方式获取到 p 的 DOM 对象,那么我们要如果对它进行操作呢(设置样式、属性、插入子元素等)?通过原始API 或者 jQuery 肯定是不允许的了。

这样我们就引出Angular抽象类 Renderer2 来对元素进行设置样式、属性、插入子元素等操作。

Renderer2 的定义如下:

class Renderer2 {    get data: {...}    destroyNode: ((node: any) => void) | null    destroy(): void    createElement(name: string, namespace?: string | null): any // 创建元素    createComment(value: string): any // 创建注释元素    createText(value: string): any // 创建文本元素    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 | null): void // 设置属性    removeAttribute(el: any, name: string, namespace?: string | null): 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 // 设置DOM对象属性,不同于元素属性    setValue(node: any, value: string): void // 设置元素值    listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void // 注册事件}

登录后复制登录后复制

因此,我们想改变 p 的背景色,就可以这样做:

ngAfterViewInit() {    this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color}

登录后复制登录后复制

相关推荐:

Angular开发实践(五):深入解析变化监测

Angular开发实践(六):服务端渲染

Angular开发实践(一):环境准备及框架搭建

以上就是Angular开发实践(七): 跨平台操作DOM及渲染器Renderer2 的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2776179.html

(0)
上一篇 2025年3月8日 14:45:01
下一篇 2025年2月25日 00:29:21

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Angular的HMR功能怎么实现

    这次给大家带来Angular的HMR功能怎么实现,Angular的HMR功能实现注意事项有哪些,下面就是实战案例,一起来看一下。 最近一个同事在使用Angular的时候,希望能像VUE那样,修改代码后浏览器不刷新,页面对应修改的组件自动更新…

    编程技术 2025年3月8日
    200
  • Angular怎样避免使用Dom的误区

    这次给大家带来Angular怎样避免使用Dom的误区,Angular使用Dom的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 Angular2的设计目标本来就是要让浏览器和DOM独立。DOM是复杂的,因此使组件与它分离,会让我们的…

    编程技术 2025年3月8日
    200
  • Angular父组件怎么调用子组件

    这次给大家带来Angular父组件怎么调用子组件,Angular父组件调用子组件的注意事项有哪些,下面就是实战案例,一起来看一下。 理解组件 组件是一种特殊的指令,使用更简单的配置项来构建基于组件的应用程序架构 这样他能简单地写app,通过…

    2025年3月8日
    200
  • Angular的单向数据流使用详解

    这次给大家带来Angular的单向数据流使用详解,使用Angular单向数据流的注意事项有哪些,下面就是实战案例,一起来看一下。 变更检测 Angular 中,数据是由顶部根节点流向最后的叶子节点,整个数据流是单向,构成一颗单向树。 Ang…

    2025年3月8日
    200
  • angular怎么实现共享服务在多个组件中数据通信

    这次给大家带来angular怎么实现共享服务在多个组件中数据通信,angular实现共享服务在多个组件中数据通信的注意事项有哪些,下面就是实战案例,一起来看一下。 应用场景,不同组件中操作统一组数据,不论哪个组件对数据进行了操作,其他组件中…

    2025年3月8日
    200
  • Angular JQuery生成简单快递管理界面的代码分享

    本篇文章给大家分享的内容是Angular JQuery生成简单快递管理界面的代码分享,有着一定的参考价值,有需要的朋友可以参考一下 话不多说,直接上代码: nbsp;html>–按状态查询–已发货未发货id  商品名用户名手机号价…

    编程技术 2025年3月8日
    200
  • python操作矩阵行列

    这次给大家带来python操作矩阵行列,python操作矩阵行列的python有哪些,下面就是实战案例,一起来看一下。 矩阵增加行 np.row_stack() 与 np.column_stack()import numpy as npa …

    2025年3月8日
    200
  • 在matlab中操作矩阵行列

    这次给大家带来在matlab中操作矩阵行列,在matlab中操作矩阵行列的注意事项有哪些,下面就是实战案例,一起来看一下。 实例如下所示: >> A=[1,2,3;4,5,6;7,8,9]A = 1 2 3 4 5 6 7 8 …

    编程技术 2025年3月8日
    200
  • Angular的浏览器插件Batarang使用详解

    这次给大家带来Angular的浏览器插件Batarang使用详解,Angular浏览器插件Batarang使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Angular浏览器插件Batarang介绍 对于Angular新手来说,刚接…

    编程技术 2025年3月8日
    200
  • Angular怎样实现定时器效果

    这次给大家带来Angular怎样实现定时器效果,Angular实现定时器效果的注意事项有哪些,下面就是实战案例,一起来看一下。 这篇文章介绍了Angular实现的简单定时器功能的实例,分享给有需要的朋友。 Angular定时器 var my…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论