列表项切换时同步到可视区域

场景

双栏分布,左侧可滚动仓库列表,右侧为对应仓库内容,所有仓库内容项是循环数组形式,一个仓库的最后一个/第一个内容项可以根据下一组/上一组按钮切换到下一个仓库/上一个仓库的内容项,但若切换后的仓库列表项超出视口区域,无法在视口中同步显示。

需求

切换仓库时,可以同步在视口区域显示。

技术

scss 复制代码
■ Element.scrollIntoView函数。
  ● 该方法会滚动元素的父容器,使被调用该方法的元素对用户可见。
  ● 无返回值。
  ● 语法形式
    ○ scrollIntoView(alignToTop)
      ■ alignToTop为true,元素顶端和其可滚动的祖先的可视区域的顶端对齐,相当于scrollIntoViewOptions:{block:"start",inline:"nearest"}。也是默认值。
      ■ alignToTop为false,元素底部和其可滚动的祖先的可视区域的底部对齐,相当于scrollIntoViewOptions:{block:"end",inline:"nearest"}。
    ○ scrollIntoView(scrollIntoViewOptions)
      ■ scrollIntoViewOptions
        ● behavior。决定滚动是即时化石平滑设置动画。
          ○ smooth。
          ○ instant。滚动在一次跳跃中立即发生。
          ○ auto。滚动行为由滚动行为的计算值决定。
        ● block。定义可滚动祖先容器中元素的垂直对齐方式。
          ○ start。元素顶部边缘和可滚动容器的顶部对齐。默认值。
          ○ center。将元素垂直对齐到可滚动容器的中心,定位在可见区域的中间。
          ○ end。元素底部和可滚动容器底部对齐。
          ○ nearest。将元素滚动到垂直方向上最近的边。若元素更靠近可滚动容器的顶部边缘,将与顶部对齐。若更靠近底部边缘,将与底部对齐。使得滚动距离最小化。
        ● inline。定义可滚动祖先容器中元素的水平对齐方式。
          ○ start。类似,左侧。
          ○ center。
          ○ end。类似,右侧。
          ○ nearest。默认值。
■ document.querySelector。
  ● 返回文档中与指定选择器或选择器组匹配的第一个Element对象。若未找到匹配项,返回null。
    ○ 深度优先遍历,从文档标记中第一个元素开始。
■ Vue的watch。
  ● 在状态变化时执行副作用。
  ● 默认懒执行
  ● 回调触发时机
    ○ 更改响应式状态,可能会同时触发Vue组件更新和侦听器回调。
    ○ 类似组件更新,用户创建的侦听器回调函数也会被批量处理以避免重复调用。
    ○ 默认,侦听器回调会在父组件更新后、所属组件的DOM更新之前被调用。注意,侦听器回调中访问的DOM是更新前的。
      ■ 访问更新后的DOM方式
        ● nextTick。
        ● 指明flush:'post'。
■ nextTick。
  ● 将回调函数延迟到下一次DOM更新循环结束后执行。

方案

1、scrollIntoView+document.querySelector+watch

html 复制代码
        <div class="warehouse-list-show">
          <div
            v-for="(item, index) in wareHouseList"
            :key="item.idx"
            :class="[
              'warehouse-list-item',
              { 'active-warehouse-item': activeWarehoueItemIndex === item.idx },
            ]"
            @click="clickWareHouseListItem(item.idx)"
          >
            <span>{{ item.name }}</span>
          </div>
        </div>
javascript 复制代码
const activeWarehoueItemIndex = ref(0);
watch(
  activeWarehoueItemIndex,
  (newWarehouseItemIndex) => {
    const itemEle = document.querySelector(".active-warehouse-item");
    if (itemEle) {
      console.log(itemEle);
      itemEle.scrollIntoView({ behavior: "smooth", block: "nearest" });
    }
  },
  { flush: "post" }
);

参考资料

bash 复制代码
■ https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
■ https://developer.mozilla.org/zh-CN/docs/Web/API/Document/querySelector
■ https://cn.vuejs.org/guide/essentials/watchers
相关推荐
mldong9 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排10 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby606110 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角11 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!11 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰12 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi13 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen14 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马15 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒15 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端