Vue 3 实现左侧列表点击跳转滚动到右侧对应区域的功能

news2024/9/22 7:29:52

使用 Vue 3 实现左侧列表点击跳转到右侧对应区域的功能

1. 引言

在这篇博客中,我们将展示如何使用 Vue 3 实现一个简单的页面布局,其中左侧是一个列表,点击列表项时,右侧会平滑滚动到对应的内容区域。这种布局在很多应用场景中都非常常见,比如目录导航、问答系统等。

2. 效果图

在这里插入图片描述
在这里插入图片描述

3. 代码示例

demo.vue
<template>
  <div class="container">
    <div class="sidebar">
      <ul>
        <li v-for="item in items" :key="item.id" @click="jump(item)">
          {{ item.name }}
        </li>
      </ul>
    </div>
    <div class="content">
      <div
        v-for="item in items"
        :key="item.id"
        :ref="el => setCombinationRef(el, `comb-${item.id}`)"
        class="content-item"
      >
        <h2>{{ item.name }}</h2>
        <p>{{ item.description }}</p>
      </div>
    </div>
  </div>
</template>

<script setup>
import { reactive, nextTick } from 'vue';

// 示例数据
const items = [
  { id: 1, name: 'Item 1', description: 'Description for Item 1' },
  { id: 2, name: 'Item 2', description: 'Description for Item 2' },
  { id: 3, name: 'Item 3', description: 'Description for Item 3' },
  { id: 4, name: 'Item 4', description: 'Description for Item 4' },
  { id: 5, name: 'Item 5', description: 'Description for Item 5' },
  { id: 6, name: 'Item 6', description: 'Description for Item 6' },
  { id: 7, name: 'Item 7', description: 'Description for Item 7' },
  { id: 8, name: 'Item 8', description: 'Description for Item 8' },
  { id: 9, name: 'Item 9', description: 'Description for Item 9' },
  { id: 10, name: 'Item 10', description: 'Description for Item 10' },
  { id: 11, name: 'Item 11', description: 'Description for Item 11' },
  { id: 12, name: 'Item 12', description: 'Description for Item 12' },
  { id: 13, name: 'Item 13', description: 'Description for Item 13' },
  { id: 14, name: 'Item 14', description: 'Description for Item 14' },
  { id: 15, name: 'Item 15', description: 'Description for Item 15' },
  { id: 16, name: 'Item 16', description: 'Description for Item 16' },
  { id: 17, name: 'Item 17', description: 'Description for Item 17' },
  { id: 18, name: 'Item 18', description: 'Description for Item 18' },
  { id: 19, name: 'Item 19', description: 'Description for Item 19' },
  { id: 20, name: 'Item 20', description: 'Description for Item 20' }
];

// 使用reactive创建一个响应式的对象来存储refs
const combinationRefs = reactive({});

// 动态设置ref
const setCombinationRef = (element, id) => {
  if (element) {
    combinationRefs[id] = element;
  }
};

// 提供一个方法来获取特定的ref
const getCombinationRef = id => {
  return combinationRefs[id];
};

// 跳转到对应小题的位置
const jump = async item => {
  const el = getCombinationRef(`comb-${item.id}`);
  if (el) {
    await nextTick();
    el.scrollIntoView({ behavior: 'smooth' });
  }
};
</script>

<style scoped>
.container {
  display: flex;
}

.sidebar {
  width: 200px;
  border-right: 1px solid #ccc;
  padding: 10px;
}

.sidebar ul {
  list-style: none;
  padding: 0;
}

.sidebar li {
  cursor: pointer;
  padding: 5px 0;
}

.sidebar li:hover {
  background-color: #f0f0f0;
}

.content {
  flex: 1;
  padding: 10px;
}

.content-item {
  margin-bottom: 20px;
  padding: 10px;
  border: 1px solid #ccc;
}
</style>
实现跳转功能

在点击左侧列表项时,我们需要跳转到右侧对应的内容区域。为此,我们需要:

  • 使用 ref 获取每个内容区域的 DOM 元素。
  • 在点击事件中调用 scrollIntoView 方法,实现平滑滚动。
// 使用reactive创建一个响应式的对象来存储refs
const combinationRefs = reactive({});

// 动态设置ref
const setCombinationRef = (element, id) => {
  if (element) {
    combinationRefs[id] = element;
  }
};

// 提供一个方法来获取特定的ref
const getCombinationRef = id => {
  return combinationRefs[id];
};

// 跳转到对应小题的位置
const jump = async item => {
  const el = getCombinationRef(`comb-${item.id}`);
  if (el) {
    await nextTick();
    el.scrollIntoView({ behavior: 'smooth' });
  }
};

结论

通过以上步骤,我们成功实现了一个简单的 Vue 3 页面布局,左侧是一个列表,点击列表项时,右侧会平滑滚动到对应的内容区域。这种布局和滚动效果在实际开发中非常常见,希望这篇博客对你有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算实训15——shell脚本、变量、自动化安装脚本、条件判断、循环

一、shell 脚本 1.基本概念 shell脚本就是由Shell命令组成的执行文件&#xff0c;将一些命令整合到一个文件 中&#xff0c;进行处理业务逻辑&#xff0c;脚本不用编译即可运行&#xff0c;它从一定程度上减轻 了工作量&#xff0c;提高了工作效率&#xff0c;还可以批量、定…

云服务部署项目(Spring + Vue)

云计算&#xff1a;腾讯云 操作系统&#xff1a;Ubuntu 22.04.4 LTS 项目&#xff1a;若依前后端分离项目&#xff08;SpringBoot Vue&#xff09; 首先要安装基本的一些依赖环境&#xff0c;大家可以看一下我往期的文章&#xff1a; Ubuntu在线JDK Ubuntu在线安装Nginx Ubunt…

Debain安装PostgreSql

目录 Debian和Centos区别 安装PostgreSql 更新包索引&#xff1a; 安装 PostgreSQL&#xff1a; 配置自动启动和启用 PostgreSQL 服务&#xff1a; 配置postGreSql 切换到 PostgreSQL 用户&#xff1a; 访问 PostgreSQL Shell&#xff1a; 设置密码 退出 PostgreSQL …

【C++题解】1066. 字符图形2-星号直角

问题&#xff1a;1066. 字符图形2-星号直角 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3输…

集成显卡和独立显卡有什么区别?

显卡&#xff08;Video card&#xff0c;Graphics card&#xff09;全称显示接口卡&#xff0c;又称显示适配器&#xff0c;是计算机最基本配置、最重要的配件之一。平时大家可能都听过集显和独显&#xff0c;那么这两个显卡类别都是什么意思呢&#xff1f; 集成显卡 集成显卡…

Unity UGUI 之 坐标转换

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 前置知识&#xff1a;…

混凝土做的风机?风领新能源推出钢-超高性能混凝土体内预应力塔筒

随着全球能源结构的转型和技术的不断进步&#xff0c;陆上风电行业已正式迈入平价时代。这一里程碑式的转变不仅降低了风电项目的投资门槛&#xff0c;更激发了行业对于机组大型化的热情与追求。在这样的市场下&#xff0c;主流风机制造商纷纷推出10MW平台级别机组&#xff0c;…

VLAN通讯实验

目录 拓扑图 需求 需求分析 配置过程 1、手工配置 2、 使用DHCP获得IP地址信息 3、测试全网是否可达 拓扑图 需求 1、PC1、PC3属于VLAN 2 2、PC2、PC4属于VLAN 3 3、通过DHCP使得PC获取IP地址信息 4、全网可达 需求分析 1、先手工配置网段&#xff0c;VLAN 2为192.168.1…

杭州东网约车管理再出行方面取得的显著成效

随着科技的飞速发展&#xff0c;网约车已成为人们日常出行的重要选择。在杭州这座美丽的城市&#xff0c;网约车服务更是如雨后春笋般蓬勃发展。特别是杭州东站&#xff0c;作为杭州的重要交通枢纽&#xff0c;网约车管理显得尤为重要。近日&#xff0c;沧穹科技郑重宣告已助力…

【iOS】 消息传递和消息转发

消息传递和消息转发 objc_msgSend执行流程消息发送动态方法解析消息转发super面试题 objc_msgSend执行流程 OC中的方法调用&#xff0c;其实都是转化为objc_msgSend函数调用&#xff0c;objc_msgSend的执行流程可以分为3大阶段 消息发送 动态方法解析 消息转发 消息发送 消…

情绪稳定的人有什么特点?

第一部分&#xff1a;至纯之人&#xff0c;大器晚成 1.1 单纯&#xff0c;不是天真 你知道吗&#xff1f;那些能够成就大事的人&#xff0c;往往在人性上非常单纯。他们对外界的需求很低&#xff0c;更多的是向内寻求。这样的人&#xff0c;他们的内心世界像一片净土&#xff…

Internet Download Manager(IDM)6.43免费试用体验版下载

1. Internet Download Manager&#xff08;IDM&#xff09;是一款功能强大的下载管理器&#xff0c;能够将下载速度提高多达5倍。 2. IDM具备多线程下载、断点续传、自动捕获链接等特性。 IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 idm最新绿色版一…

HarmonyOS 核心功能:一多特性

简述定义和目标&#xff0c;分述界面级&#xff08;核心&#xff09;、功能级、工程级的一多开发 定义&#xff1a; 一套代码&#xff0c;一次开发&#xff0c;多端按需部署 目标&#xff1a;支持开发者快速开发多设备上的应用 一 界面级一多开发&#xff08;重点&#xf…

宝塔单ip,新建多站点

报错如上&#xff1a; 那么如何新建多站点呢 先随便写个名字上去&#xff0c;然后再重新绑定别的端口… 这个时候访问99端口即可 。 如果是有域名&#xff0c;则不需要这样做 、直接80端口也可以多站点

FPGA:有限状态机

从以下6个实验理解状态机的概念 开发板频率为 50 M H z 50MHz 50MHz&#xff0c;一个时钟周期是 20 n s 20ns 20ns。 1、实验一:LED灯亮0.25秒、灭0.75秒的状态循环 通过之前的分析&#xff0c;我们实现频闪灯时&#xff0c;是让led灯在0.5秒实现一次翻转&#xff0c;而这里…

《Cross-Modal Dynamic Transfer Learning for Multimodal Emotion Recognition》

Multi-modal系列论文研读目录 文章目录 Multi-modal系列论文研读目录1.ABSTRACT2.INDEX TERMS3.INTRODUCTION4.RELATED WORKSA. MULTIMODAL EMOTION RECOGNITION 多模态情感识别1) CONVENTIONAL FUSION METHODS 常规融合方法2) TRANSFORMER-BASED FUSION METHODS 基于变压器的融…

Redis (常用数据结构和命令)

目录 简介 概述 特点 数据结构 常用命令 通用命令 keys del exists expire 与 ttl String 命令 SET 和GET: MSET和MGET INCR和INCRBY和DECY SETNX SETEX Redis 命令 Key 的层级结构 key层级关系 &#xff1a; Hash命令 HSET和HGET HMSET和HMGET HGETALL H…

MySQL练手 --- 1141. 查询近30天活跃用户数

题目链接&#xff1a;1141. 查询近30天活跃用户数 思路&#xff1a; 题目要求&#xff1a;统计截至 2019-07-27&#xff08;包含2019-07-27&#xff09;&#xff0c;近 30 天的每日活跃用户数&#xff08;当天只要有一条活动记录&#xff0c;即为活跃用户&#xff09; 要计算…

前端模块化CommonJS、AMD、CMD、ES6

在前端开发中&#xff0c;模块化是一种重要的代码组织方式&#xff0c;它有助于将复杂的代码拆分成可管理的小块&#xff0c;提高代码的可维护性和可重用性。CommonJS、AMD&#xff08;异步模块定义&#xff09;和CMD&#xff08;通用模块定义&#xff09;是三种不同的模块规范…

H3CNE(OSPF动态路由)

目录 7.1 静态路由的缺点与动态路由分类 7.1.1 静态路由的缺点 7.1.2 动态路由的分类 7.2 OSPF基础 7.2.1 OSPF的区域 ​编辑 7.2.2 Router-id 7.2.3 开销-Cost or Metric 7.2.4 路由转发 7.3 OSPF邻居表建立过程 7.3.1 五种包 7.3.2 建立邻居表的第一步 7.3.3 邻居建立…