rxjs distinctUntilChanged比较input框的两次值是否相同

发布于 2022-09-12 23:57:12 字数 1466 浏览 24 评论 0

业务场景:一个input框,监听当前内容发生变化,判断非空、前后两次值不一样,防抖后,发送请求并展示数据

使用of创建一个流,使用该操作符

of<Person>(
      { age: 4, name: 'Foo' },
      { age: 7, name: 'Bar' },
      { age: 5, name: 'Foo' },
      { age: 6, name: 'Foo' },
      { age: 8, name: 'Foo' },
      { age: 9, name: 'Foo' },
      { age: 2, name: 'Foo1' },
    )
      .pipe(
        distinctUntilChanged((p, q) => {
          console.log(p, q, p.name === q.name);
          return p.name === q.name;
        })
      )
      .subscribe((x) => console.log(x));
      //{"age":4,"name":"Foo"}
      //{"age":7,"name":"Bar"}
      //{"age":5,"name":"Foo"}
      //{"age":2,"name":"Foo1"}

监听input的变化

    this.input$ = fromEvent(this.inputEl.nativeElement, 'input');
    this.input$
      .pipe(
        filter((el) => {
          return Boolean(el.target.value);
        }),
        // map(input => input),
        distinctUntilChanged((pre: InputEvent, next: InputEvent) => {
          return (
            (pre.target as HTMLInputElement).value ===
            (next.target as HTMLInputElement).value
          );
        }),
        debounceTime(500)
      )
      .subscribe((val) => {
        console.log(val)
      });

期望使用rxjs操作符,能比较两次值的,并且保留input事件触发(不使用change事件),如果一致则不做操作(不要手动缓存比)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

早茶月光 2022-09-19 23:57:12
watchInput() {
    this.input$ = fromEvent(this.inputEl.nativeElement, 'input');
    this.input$
      .pipe(
        filter((el) => {
          return Boolean(el.target.value);
        }), // 过滤空值
        map((e) => e.target.value), // 映射value
        distinctUntilChanged((pre, cur) => pre === cur), // 校验前后两次的value是否一致
        debounceTime(500),
        switchMap((val) => {
          if (this.cache.get(val)) {
            return this.cache.get(val);
          }
          return this.http.get('http://localhost:8000/list').pipe(
            tap((result) => this.cache.set(val, of(result))),
            shareReplay(1)
          );
        }) // 取消上一次未完成的流
      )
      .subscribe((res) => {
        this.list = res as IInputResponse[];
        this.cdr.markForCheck();
      });
  }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文