React 项目运用 RxJS 设置节流

RxJS 核心概念

一小时入门RxJS,中文教学放心适用,讲解非常棒

按钮组:

html 复制代码
<button nz-button nzType="primary" style="cursor:pointer !important; margin-bottom: 4px;" (click)="throttleClick(flag1, 2000, btnFunc1)">btn1</button>

<button nz-button nzType="primary" style="cursor:pointer !important; margin-bottom: 4px;" (click)="throttleClick(flag2, 2000, btnFunc2)">btn2</button>

引用 rxjs :

javascript 复制代码
import { Subject, forkJoin, Observable, of } from 'rxjs'; // 引入 forkJoin
import { throttleTime, takeUntil, catchError, tap, map } from 'rxjs/operators';

按钮触发事件:

javascript 复制代码
// 点击 btn1 按钮触发的事件
btnFunc1(): Observable<any> {}

// 点击 btn2 按钮触发的事件
btnFunc1(): Observable<any> {}

设置节流:

  • takeUntil

    函数签名: takeUntil(notifier: Observable): Observable

    发出值,直到提供的 observable 发出值,它便完成。

  • throttleTime

    函数签名: throttleTime(duration: number, scheduler: Scheduler): Observable

    当指定的持续时间经过后发出最新值。

  • call() 是函数的原生方法,作用是立即执行该函数 ,并强制绑定函数内部的 this 指向第一个参数,后续参数作为函数的入参传入。

  • bind() 是 JavaScript 函数的原生方法,核心作用是创建一个新函数,这个新函数被调用时,其内部的 this 会永久绑定到 bind() 的第一个参数,同时可以预先传入部分参数(柯里化)

javascript 复制代码
throttleClick(btnKey: string, delay: number, callback: () => void): void {
   // 若该按钮未创建 Subject,初始化并设置节流
   if (!this.buttonSubjects.has(btnKey)) {
   const subject$ = new Subject<void>();
   subject$
       .pipe(
       throttleTime(delay), // 节流核心
       takeUntil(this.destroy$) // 组件销毁时取消订阅
       )
       .subscribe(function() { callback.call(this)}.bind(this)); // 执行按钮回调
       this.buttonSubjects.set(btnKey, subject$);
   }

   // 发送点击信号
   this.buttonSubjects.get(btnKey) && this.buttonSubjects.get(btnKey).next();
}

完整 js 代码

javascript 复制代码
import { Subject, forkJoin, Observable, of } from 'rxjs'; // 引入 forkJoin
import { throttleTime, takeUntil, catchError, tap, map } from 'rxjs/operators';

// 存储每个按钮的 Subject(key=按钮标识,value=对应 Subject)
private buttonSubjects = new Map<string, Subject<void>>();
// 组件销毁信号
private destroy$ = new Subject<void>();

throttleClick(btnKey: string, delay: number, callback: () => void): void {
   // 若该按钮未创建 Subject,初始化并设置节流
   if (!this.buttonSubjects.has(btnKey)) {
   const subject$ = new Subject<void>();
   subject$
       .pipe(
       throttleTime(delay), // 节流核心
       takeUntil(this.destroy$) // 组件销毁时取消订阅
       )
       .subscribe(function() { callback.call(this)}.bind(this)); // 执行按钮回调
       this.buttonSubjects.set(btnKey, subject$);
   }

   // 发送点击信号
   this.buttonSubjects.get(btnKey) && this.buttonSubjects.get(btnKey).next();
}

// 点击 btn1 按钮触发的事件
btnFunc1(): Observable<any> {}

// 点击 btn2 按钮触发的事件
btnFunc1(): Observable<any> {}


ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
    // 遍历销毁所有按钮的 Subject
    this.buttonSubjects.forEach(subject$ => subject$.complete());
    this.buttonSubjects.clear();
}
相关推荐
空想兔8 小时前
AgentPulse:实时监控所有的 OpenCode Agent 跑到哪一步了
react.js·ai编程
YIAN8 小时前
React + Zustand + JWT 前端权限体系完整实现:从登录鉴权到路由守卫全流程拆解
前端·react.js·架构
光影少年13 小时前
react navite高频手写/实操题
前端·javascript·react native·react.js·前端框架
梦想的颜色15 小时前
【AI实战】React‑Native + AI 移动端 APP 完整实战全流程|云端 / 本地大模型、Agent 集成、安装配置、避坑指南
react.js·大模型·app·agent·reactnative·expo·ai 应用开发
zzzzzz31018 小时前
react-bits:酷炫动效之外,React 组件库还能提供什么
javascript·react.js·动效
专业抄代码选手1 天前
08|Fiber 上的 `useState`:状态终于属于具体组件
前端·javascript·react.js
BreezeJiang2 天前
为什么生成了 dist,项目还是可能跑不起来?从一个 React + Express + MySQL 项目看部署闭环
nginx·react.js
奴心2 天前
我受够了 value / defaultValue / onChange 三连——一个 prop 重构 React 受控组件
react.js
用户298698530142 天前
React 中 HTML 内容转 Word 文档的实现方案
javascript·react.js·html
浮生望2 天前
React JWT 登录鉴权实战:Zustand 状态管理 + Axios 拦截器 + 路由守卫完整链路
react.js