Angular使用指令配合RXJS使用节流throttle

58 篇文章 3 订阅
13 篇文章 0 订阅
  • 节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效 throttle
  • 防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时 debounce

之前说起节流防抖,都是在事件内部用RXJS处理的(最开始写的是原生,设定计时器和开关)。后来看到别人把节流防抖放在 Angular 指令 Directives里,并且使用@output装饰器触发元素的指定事件。

太妙了。

import { Directive, EventEmitter, HostListener, OnInit, Output, OnDestroy } from '@angular/core';
import { Subject, Subscription } from 'rxjs';
import { throttleTime } from 'rxjs/operators';
/**
 * 点击节流器:避免连续点击
 */
@Directive({
  selector: '[directive-throttle]'
})
export class ThrottleClickDirective implements OnInit, OnDestroy {
  // 一定的时间内只执行第一个事件
  private THROTTLE_TIME: number = 500;
  private subject = new Subject<MouseEvent>();
  private click: Subscription;
  // 事件方法
  @Output() throttleClick = new EventEmitter();

  constructor() { }

  ngOnInit(): void {
    const result = this.subject.pipe(
      throttleTime(this.THROTTLE_TIME)
    );
    this.click = result.subscribe(e => {
      this.throttleClick.emit(e)
    })

  }

  ngOnDestroy() {
    this.click.unsubscribe();
  }

  @HostListener('click', ['$event'])
  onClick(evt: MouseEvent) {
    this.subject.next(evt);
  }
}

代码不多,但是涉及到的知识点很多。

1. RXJS subject

RxJS 核心概念之Subject_Alex__Gong的博客-CSDN博客本文出处:https://segmentfault.com/a/1190000005069851,我做了一部分修改我们在接触到RxJS的时候,不免会有点晕头转向的感觉,对于什么是Subject,什么是Observer,什么是Observable,总感觉晕乎乎的。下面我引用一篇为自认为比较通俗易懂的博文,再加上自己的描述来给大家解释下,弄明白之后对于学习Angular2+有很大的帮助,因为在https://blog.csdn.net/GongZhongNian/article/details/787387562. RXJS throttle

使用rxjs以及javascript解决前端的防抖和节流,以及防抖在vue中的用法_榴莲不好吃的博客-CSDN博客_rxjs 节流JavaScript实现方式:防抖触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间;思路:每次触发事件时都取消之前的延时调用方法:举个例子:做一个自动查询的功能假装下面的代码是从服务器获取的数据(下面会用到):// 假装这是个接口function getData(val){ return new Promise(functi...https://blog.csdn.net/sllailcp/article/details/1000899823. @output + EventEmitter

Angular 父组件监听子组件事件--by EventEmitter - 简书EventEmitter的一个典型应用就是父组件监听子组件的事件。 子组件暴露一个 EventEmitter 属性,当事件发生时,子组件利用该属性 emits(向上弹射)事件...https://www.jianshu.com/p/145a06f052064. @HostListener

https://angular.cn/api/core/HostListenericon-default.png?t=M5H6https://angular.cn/api/core/HostListener

思考:@Directive + @HostListener 的使用应该可以做很多有意思的的事情。之前对指令的认知仅仅是停留在校验器的使用。

或许可以开发更多的玩法?

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 在 Angular 中,属性型指令是一种用于修改 HTML 元素属性的指令。它们可以通过添加特殊的属性到 HTML 元素上来使用。 下面是一个使用属性型指令的示例: 假设我们有一个名为 "highlight" 的属性型指令,它会将文本的背景颜色改为黄色。 在 HTML 模板中,我们可以使用指令: ``` <p highlight>这是一段需要高亮的文本。</p> ``` 在这里,我们将 "highlight" 属性添加到了段落标签上。Angular 会识别这个指令并执行它的逻辑,从而将文本的背景颜色更改为黄色。 ### 回答2: Angular中的属性型指令是一种可以通过在HTML元素上添加属性来改变元素的行为或样式的指令。下面是一个使用属性型指令的简单示例。 假设有一个列表组件,需要在列表项上添加一个高亮效果。我们可以创建一个属性型指令来实现这个功能。 首先,在终端上通过Angular CLI生成一个新的属性型指令: ```shell ng generate directive highlight ``` 生成的指令文件 `highlight.directive.ts` 如下: ```typescript import { Directive, ElementRef, Input } from '@angular/core'; @Directive({ selector: '[appHighlight]' }) export class HighlightDirective { constructor(private el: ElementRef) {} @Input('appHighlight') highlightColor: string; ngOnInit() { this.el.nativeElement.style.backgroundColor = this.highlightColor || 'yellow'; } } ``` 然后,在组件的模板中使用这个指令: ```html <ul> <li *ngFor="let item of items" [appHighlight]="'red'">{{ item }}</li> </ul> ``` 在上面的示例中,我们在 `li` 元素上使用了 `appHighlight` 指令,并设置了高亮颜色为 `'red'`。这样,在渲染时,所有带有 `appHighlight` 属性的 `li` 元素都会被高亮显示为红色。 总结起来,使用属性型指令的步骤包括创建指令文件、在指令文件中定义属性和逻辑,然后在模板中应用指令并设置相关属性。通过这种方式,我们可以方便地在Angular中修改元素的行为和样式。 ### 回答3: Angular中的属性型指令是一种能够通过元素的属性来修改元素的行为或样式的指令。我们可以在HTML中使用这些指令来动态改变元素的属性。 举个例子,假设我们有一个按钮元素,并且想要在按钮上添加一个背景颜色的指令。首先,我们需要在组件的模板中将按钮元素添加上指令。比如: <button appBackgroundColorDirective>点击我</button> 然后,在组件中我们需要创建一个指令,并且通过@Directive装饰器将其标记为属性型指令。在指令中,我们可以通过@HostBinding装饰器来绑定具体的属性。比如,我们可以将背景颜色绑定到按钮的样式属性。 import { Directive, ElementRef, HostBinding } from '@angular/core'; @Directive({ selector: '[appBackgroundColorDirective]' }) export class BackgroundColorDirective { @HostBinding('style.backgroundColor') backgroundColor = 'red'; } 在上面的例子中,我们创建了一个名为BackgroundColorDirective的指令,并使用@Directive装饰器将其标记为属性型指令。然后,通过@HostBinding装饰器将style.backgroundColor属性绑定到了backgroundColor变量。这意味着当我们在模板中使用这个指令时,按钮的背景颜色将会被设置为红色。 最后,在应用的模块中,我们需要将这个指令添加到NgModule的declarations数组中,以便在应用中可以使用它。比如: import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { BackgroundColorDirective } from './background-color.directive'; @NgModule({ imports: [BrowserModule], declarations: [AppComponent, BackgroundColorDirective], bootstrap: [AppComponent] }) export class AppModule { } 通过以上步骤,我们就可以在Angular使用属性型指令来修改元素的属性了。当我们运行应用时,按钮的背景颜色将会被设置为红色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值