当前位置: 首页 > 知识库问答 >
问题:

javascript - 请问如何优化这个存在异步逻辑的滚动事件监听函数?

霍建柏
2023-09-04
async _handleBrandListScroll() {  const { ids, mainScrollerOffset } = this.data;  let indexs: number[] = [];  for (const id of ids) {    const [[{ top: rectTop }]] = await queryBoundingClient(this, id);    if (typeof rectTop !== 'number') continue;    if (rectTop <= mainScrollerOffset) {      const idIndexs = getIdIndexs(id);      if (!_.isUndefined(idIndexs)) {        indexs = idIndexs;      }    } else {      break;    }  }  const [mainIndex, subIndex] = indexs;  if (this.data.currentLeftTabIndex !== mainIndex) {    this.setData({ currentLeftTabIndex: mainIndex });    this.updateCurrentTopTabList(mainIndex);  }  if (this.data.currentTopTabIndex !== subIndex) {    this.setData({ currentTopTabIndex: subIndex });    this.updateTopTabsScrollLeft(subIndex);  }},

主要问题是 queryBoundingClient 是异步返回结果的(在微信小程序环境中),导致 _handleBrandListScroll 的 throttle 无效,结果 indexs 不准。体现在视图上就是,滑动过快时当前选中的 tab 来回横跳。

共有1个答案

柯良骏
2023-09-04
async _handleBrandListScroll() {  const { ids, mainScrollerOffset } = this.data;  let indexs: number[] = [];  // Step 1: 批量处理异步请求  const rectTops = await Promise.all(ids.map(id => queryBoundingClient(this, id)));    for (let i = 0; i < rectTops.length; i++) {    const [[{ top: rectTop }]] = rectTops[i];    if (typeof rectTop !== 'number') continue;    if (rectTop <= mainScrollerOffset) {      const idIndexs = getIdIndexs(ids[i]);      if (!_.isUndefined(idIndexs)) {        indexs = idIndexs;      }    } else {      break;    }  }  const [mainIndex, subIndex] = indexs;  if (this.data.currentLeftTabIndex !== mainIndex) {    this.setData({ currentLeftTabIndex: mainIndex });    this.updateCurrentTopTabList(mainIndex);  }  if (this.data.currentTopTabIndex !== subIndex) {    this.setData({ currentTopTabIndex: subIndex });    this.updateTopTabsScrollLeft(subIndex);  }},
 类似资料:
  • 本文向大家介绍vue监听滚动事件实现滚动监听,包括了vue监听滚动事件实现滚动监听的使用技巧和注意事项,需要的朋友参考一下 在vue中实现滚动监听和原生js无太大差异,下面是一个简单的demo,可在控制台查看结果 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍vue监听滚动事件的方法,包括了vue监听滚动事件的方法的使用技巧和注意事项,需要的朋友参考一下 vue中监听滚动事件,然后对其进行事件处理,一般有:1. 滚动到顶部吸附; 2. 根据滚动的位置激活对应的tab键(锚链接tab键) 这两种方式的处理都是可通过监听scroll来实现 处理方法 1. 滚动到顶部吸附 html元素 methods方法 2. 根据滚动的位置激活对应的tab键

  • 本文向大家介绍javascript监听鼠标滚轮事件浅析,包括了javascript监听鼠标滚轮事件浅析的使用技巧和注意事项,需要的朋友参考一下 我们都见到过这些效果,用鼠标滚轮实现某个表单内的数字增加减少操作,或者滚轮控制某个按钮的左右,上下滚动。这些都是通过js对鼠标滚轮的事件监听来实现的。今天这里介绍的是一点简单的js对于鼠标滚轮事件的监听。 不同浏览器不同的事件 首先,不同的浏览器有不同的滚

  • 导航条示例 滚动监听插件会根据滚动的位置,自动更新导航条的目标。滚动在导航条下面的区域,查看active类的改变。弹出菜单的子项也同样会被高亮。 用法 需要Bootstrap导航条 Scrollspy currently requires the use of a Bootstrap nav component for proper highlighting of active links. 滚动

  • 滚动监听是一个 jQuery 插件,用于追踪某一确定元素并且元素目前处于用户屏幕的焦点。我们的示例在每个文档页的右边。单击这些链接将滚动到页面元素的位置。 表格内容的结构 <div class="row"> <div class="col s12 m9 l10"> <div id="introduction" class="section scrollspy"> <p>内容 </p>