面试题答案
一键面试1. 创建属性型自定义指令的基本步骤和关键代码
- 创建指令:
- 使用Angular CLI可以快速生成指令,在终端运行以下命令:
ng generate directive highlight
- 这会在
src/app
目录下生成一个highlight.directive.ts
文件。
- 编写指令代码:
- 打开
highlight.directive.ts
文件,代码如下:
import { Directive, ElementRef, HostListener, Input } from '@angular/core'; @Directive({ selector: '[appHighlight]' }) export class HighlightDirective { constructor(private el: ElementRef) {} @Input() appHighlight: string; @HostListener('mouseenter') onMouseEnter() { this.highlight(this.appHighlight || 'yellow'); } @HostListener('mouseleave') onMouseLeave() { this.highlight(null); } private highlight(color: string) { this.el.nativeElement.style.backgroundColor = color; } }
- 打开
- 在模板中使用指令:
- 在组件的模板(例如
app.component.html
)中使用该指令:
<p appHighlight="lightblue">This text will have a highlighted background on hover</p>
- 在组件的模板(例如
2. 工作原理解释
- 装饰器和选择器:
@Directive
装饰器用于将一个类标记为指令。selector
属性指定了指令在模板中使用的方式,这里[appHighlight]
表示这是一个属性型指令,当元素上出现appHighlight
这个属性时,该指令会生效。
- 依赖注入:
ElementRef
通过构造函数注入到指令类中。ElementRef
提供了对宿主DOM元素的引用,使得指令可以操作该元素。
- 输入属性:
@Input() appHighlight: string;
声明了一个输入属性appHighlight
。这个属性可以从模板中传递值进来,用于指定需要应用的背景颜色。
- 宿主监听器:
@HostListener('mouseenter')
和@HostListener('mouseleave')
装饰器用于监听宿主元素的mouseenter
和mouseleave
事件。当鼠标进入元素时,onMouseEnter
方法被调用,调用highlight
方法并传入指定的颜色(如果没有传入则使用默认的'yellow'
);当鼠标离开元素时,onMouseLeave
方法被调用,调用highlight
方法并传入null
,即清除背景颜色。
- 样式操作:
highlight
方法通过ElementRef
获取到宿主DOM元素,并直接操作其style.backgroundColor
属性来应用或移除背景颜色,从而实现为元素添加特定CSS样式的功能。