Vue3 实战:打造多功能旅游攻略选项卡页面

在旅游类应用开发中,为用户提供全面、直观的信息展示界面至关重要。本文将分享如何基于 Vue3 + Axios 技术栈,实现一个包含攻略、游记、问答三大板块的旅游攻略选项卡页面,从样式设计到交互逻辑,带你深入了解整个开发过程。

项目背景与需求分析

随着旅游行业的数字化转型,用户对于景区信息获取的需求日益多样化。游客不仅希望了解景区的游玩攻略、动物分布,还想查看其他游客的真实游记以及专业问答。因此,需要构建一个集多类型内容展示、交互跳转于一体的页面,通过选项卡形式高效组织信息,提升用户体验。

技术栈解析

  1. Vue3:采用 Vue3 的响应式系统和组合式 API,简化组件逻辑,提高开发效率和代码可读性。
  2. Axios:用于发起 HTTP 请求,从后端接口获取攻略、游记、问答等数据。
  3. CSS3:利用现代 CSS 特性实现美观的样式布局和交互效果。

代码实现详解

1. 样式设计(<style scoped>部分)

* {margin: 0;padding: 0;box-sizing: border-box;
}
.container {width: 100%;
}
.tabs {width: 100%;display: flex;position: relative;height: 50px;background-color: white;
}
.tabs_label {width: 33.33%;text-align: center;line-height: 50px;cursor: pointer;height: 50px;transition: color 0.3s;
}
.tabs_label.active {color: red;font-weight: bold;
}
.line {width: 10%;height: 3px;position: absolute;bottom: 0;background-color: red;
}
.tab-content {min-height: 200px;
}

通过*选择器重置浏览器默认样式,使用box-sizing: border-box确保元素尺寸计算更符合预期。.tabs容器作为选项卡导航栏,采用 Flex 布局实现标签横向排列。.tabs_label定义标签样式,通过:active类控制选中状态下的颜色和加粗效果,底部的.line用于实现切换时的红色指示线动画。 

.start_panda {width: 96%;height: 310px;margin-left: 2%;margin-top: 10px;background-color: white;border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.start_img {width: 100%;height: 200px;border-radius: 10px 10px 0 0;object-fit: cover;
}

攻略板块的样式中,.start_panda定义攻略卡片整体样式,通过box-shadow添加阴影效果增强立体感;.start_img确保图片在卡片顶部完整展示且保持圆角效果。 

.product_list {margin-top: 2%;column-count: 2;column-gap: 10px;flex-wrap: wrap;padding: 10px;gap: 10px;
}
.product_item {break-inside: avoid;margin-bottom: 10px;background-color: #ffffff;border-radius: 5px;
}

游记板块使用column-count实现多列布局,提升页面空间利用率,同时通过break-inside: avoid避免卡片内容在列中断开,保持展示完整性。 

.answers_box {width: 100%;height: 150px;background-color: white;display: flex;justify-content: space-between;border-bottom: 1px solid #e5e5e5;
}

问答板块的.answers_box采用 Flex 布局,使每个问答项内的元素横向排列且两端对齐,通过底部边框实现问答项之间的视觉分隔。 

2. 模板搭建(<template>部分) 

<template><div class="container"><!-- 选项卡导航 --><div class="tabs"><div class="tabs_label" :class="{ active: activeTab ==='strategy' }" @click="switchTab('strategy')">攻略</div><div class="tabs_label" :class="{ active: activeTab === 'travelNotes' }" @click="switchTab('travelNotes')">游记</div><div class="tabs_label" :class="{ active: activeTab === 'qna' }" @click="switchTab('qna')">问答</div><!-- 底部指示线 --><div class="line" :style="lineStyle"></div></div><!-- 内容区域 --><div class="content"><!-- 攻略的内容区域 --><div v-show="activeTab ==='strategy'" class="tab-content"><!-- 具体攻略内容 --></div><!-- 游记的内容区域 --><div v-show="activeTab === 'travelNotes'" class="tab-content"><!-- 具体游记内容 --></div><!-- 问答的内容区域 --><div v-show="activeTab === 'qna'" class="tab-content"><!-- 具体问答内容 --></div></div></div>
</template>

模板部分通过v-show指令根据activeTab的值控制不同板块的显示与隐藏。选项卡标签绑定click事件,触发switchTab方法切换当前选中项,底部指示线通过:style绑定计算属性lineStyle,实现平滑的动画切换效果。 

3. 逻辑实现(<script setup>部分) 

import { ref, computed } from 'vue';
import axios from "axios";
import { useRouter } from "vue-router";
const router = useRouter();const data = ref(null);
const res_data = ref(null);
const queans_data = ref(null);// 选项卡切换状态
const activeTab = ref('strategy');
const lineStyle = computed(() => {const positions = {'strategy': '11.5%','travelNotes': '44.5%','qna': '77.5%'};return {left: positions[activeTab.value],transition: 'left 0.3s ease-in-out'};
});
function switchTab(tabName) {activeTab.value = tabName;
}

在 Vue3 的组合式 API 中,使用ref定义响应式数据存储接口返回的数据和选项卡状态。computed计算属性lineStyle根据当前选中的选项卡动态计算指示线的位置,实现动画切换。switchTab方法用于更新activeTab的值,触发视图更新。 

// 发送axios请求
axios({method: "post",url: "/app/intro/index",data: {scenic_id: 2,},
}).then((res) => {console.log(res.data.data);data.value = res.data.data;}).catch((err) => {console.log(err);});// 请求游记列表的接口
axios({method: "post",url: "/app/Travels/index",
}).then((res) => {console.log(res.data.data);res_data.value = res.data.data;}).catch((err) => {console.log(err);});// 请求问答列表的接口
axios({method: "post",url: "/app/Queans/index",
}).then((res) => {console.log(res.data.data);queans_data.value = res.data.data;}).catch((err) => {console.log(err);})

通过 Axios 分别向后端三个接口发起 POST 请求,获取攻略、游记、问答数据,并将响应数据存储到对应的ref变量中,驱动页面数据渲染。 

// 修改后的跳转函数,接收item参数
const goToDetail = (item) => {router.push({name: "details_page",params: { id: item.id }});console.log(item.id);sessionStorage.setItem('intro_data', JSON.stringify(item));sessionStorage.setItem('intro_id', item.id);
}

goToDetail函数实现点击具体内容项跳转到详情页的功能,将当前项的 ID 作为路由参数传递,并将相关数据存储到sessionStorage中,方便详情页获取和展示。 

效果展示与优化建议

最终实现的页面,选项卡切换流畅,各板块数据展示清晰。后续可从以下方向优化:

  1. 性能优化:对图片进行懒加载处理,减少页面初始加载时间;对接口请求添加防抖或节流,避免频繁请求。
  2. 交互增强:在选项卡切换时添加更丰富的过渡动画,优化移动端触摸交互体验。
  3. 数据处理:增加数据缓存机制,避免重复请求相同数据;对接口返回数据进行更严格的格式校验和错误处理。

通过以上步骤,我们成功构建了一个功能完备、界面美观的旅游攻略选项卡页面。希望本文能为你的 Vue3 项目开发提供实用参考,助力打造更优质的用户体验

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

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

相关文章

JavaScript性能优化实战(1):性能优化基础与性能分析工具

性能优化的重要性与业务价值 在当今竞争激烈的互联网环境中,网站和应用的性能已成为用户体验和业务成功的关键因素。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而53%的用户会在页面加载时间超过3秒后放弃访问。这些数据直接揭示了性能优化对业务的巨大影响: 用户…

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询&#xff08;spatial queries&#xff09;&#xff0c;例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本&#xff0c;并调整寻路和避免的全局行为。 静态属性&#xff0…

Java 静态内部类面试题与高质量答案合集

本文整理了关于 Java 静态内部类&#xff08;Static Nested Class&#xff09;在面试中的高频问题及标准答案&#xff0c;帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类&#xff1f;和普通内部类有什么区别&#xff1f; 答&#xff1a; 静态内部类是定义…

为什么买不到一定阻抗特性曲线的磁环

为什么买不到一定阻抗特性曲线的磁环&#xff1a; 磁环绕不同的圈数&#xff0c;阻抗特性曲线不同&#xff0c;磁环没有类似于磁珠的特定频率和阻抗特性曲线的磁环。 磁环与磁珠的核心区别&#xff1a; 磁珠是一种固定频率阻抗器件&#xff0c;出厂时已通过材料和工艺设计确定…

【MATLAB海洋专题】历史汇总

【MATLAB海洋专题】历史汇总 目录 01&#xff1a;海洋专题进阶教学 02&#xff1a;海洋数据处理 03&#xff1a;海洋数据下载 04&#xff1a;海洋配色 05&#xff1a;海洋专题基础教学 06: 其他基础画图 07&#xff1a;python 画海图专题 08&#xff1a;模式相关文件制作 01…

数据仓库ODS、DWD、DWS、ADS各层介绍

数据仓库Data warehouse&#xff08;可简写为DW或者DWH&#xff09;建设的目的&#xff0c;是为前端查询和分析作为基础&#xff0c;主要应用于OLAP&#xff08;on-line Analytical Processing&#xff09;&#xff0c;支持复杂的分析操作&#xff0c;侧重决策支持&#xff0c;…

动态提示词(小模型)、RAG和提示词系统

动态提示词(小模型)、RAG和提示词系统 目录 动态提示词(小模型)、RAG和提示词系统小模型方案:动态提示词基于规则的动态提示词生成基于模板的动态提示词生成基于小模型的动态提示词生成基于强化学习的动态提示词生成基于元学习的动态提示词生成动态提示词(小模型)RAG(检…

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …

云账号安全事件应急响应指南:应对来自中国IP的异常访问

在当今数字化时代,云服务已成为企业IT基础设施的核心。然而,随之而来的安全挑战也日益突出。本文将详细介绍当发现云账号被来自中国的IP地址异常利用时,应如何快速有效地响应,以确保账户安全并最小化潜在风险。 1. 确认异常活动 首先,我们需要确认是否真的发生了安全事件…

三网通电玩城平台系统结构与源码工程详解(五):客户端热更机制与多端资源分发流程

本篇将聚焦三网通平台在多客户端部署中的资源热更机制设计、跨平台同步策略、版本控制与前端资源发布管理&#xff0c;帮助开发者搭建高效稳定的资源更新系统。 一、资源分发平台架构 为实现安卓端、iOS端、PC端的统一更新分发&#xff0c;平台采用 Node.js Express 构建资源…

spark和hadoop的区别

一、spark概述 二、处理速度 三、 编程模型 四、实时性处理 五、spark内置模块 六、spark的运行模式

AI写代码之GO+Python写个爬虫系统

下面我们我们来利用AI&#xff0c;来用GOPython写个爬虫系统。 帮我写一个Python语言爬取数据写入Mysql的案例&#xff0c;信息如下&#xff1a; 1、Mysql数据库地址是&#xff1a;192.168.1.20 &#xff0c;mysql用户名是&#xff1a;root&#xff0c; Mysql密码是&#xff1…

从单模态到多模态:深度生成模型的演进历程

在人工智能领域&#xff0c;生成模型的发展一直是研究热点。从最早的自编码器到如今的多模态扩散模型&#xff0c;这一技术路线不断突破&#xff0c;为创意内容生成、数据增强和表示学习等领域带来革命性变化。本文将详细介绍几种关键生成模型的技术原理和演进路径&#xff0c;…

【系统架构设计师】嵌入式微处理器

目录 1. 说明2. 微处理器(MPU)3. 微控制器(MCU)4. 信号处理器(DSP)5. 图形处理器(GPU)6. 片上系统(SoC)7. 例题7.1 例题1 1. 说明 1.嵌入式微处理器主要用于处理相关任务。2.由于嵌入式系统通常都在室外使用&#xff0c;可能处于不同环境&#xff0c;因此&#xff0c;选择处理…

Cursor Free VIP 重置进程错误,轻松恢复使用!

快速修复 Cursor Free VIP 重置进程错误&#xff0c;轻松恢复使用&#xff01; 在使用 Cursor Free VIP 的过程中&#xff0c;突然遭遇 “重置进程错误” 是不是让你手忙脚乱&#xff1f;当屏幕弹出 “文件未找到: C:\Users\用户\AppData\Local\Programs\Cursor\resources\app…

dolphinscheduler实现(oracle-hdfs-doris)数据ETL

dolphinscheduler执行 完整脚本(自行替换相关变量)配置文件conf配置文件解析脚本转base64脚本 完整脚本(自行替换相关变量) user_olsh conf/getInfo.sh Oracle user conf/databases.conf password_olsh conf/getInfo.sh Oracle password conf/databases.conf dblink_olsh conf…

小小矩阵设计

在电气设计图中&#xff0c;矩阵设计的接线方法是通过结构化布局实现多灵活链接的技术&#xff0c;常用于信号切换、配电调压或更加复杂的控制场景。 今天聊一种在电气图纸中用到的一种简单矩阵接法&#xff0c;一眼就看明白&#xff0c;很大程度简化了程序控制点和继电器的使用…

【音视频】FFmpeg解封装

解封装 复用器&#xff0c;比如MP4/FLV 解复用器&#xff0c;MP4/FLV 封装格式相关函数 avformat_alloc_context(); 负责申请一个AVFormatContext结构的内存,并进行简单初始化avformat_free_context(); 释放该结构里的所有东西以及该结构本身avformat_close_input();关闭解复…

1️⃣5️⃣three.js_GUI辅助调试器

15、GUI辅助调试器 3D虚拟工厂在线体验 GUI辅助调试器将原本需要修改代码调整参数并刷新页面的操作&#xff0c;简化为直接在GUI中实时调整&#xff0c;实现所见即所得的效果。 导入GUI 库 //引入GUI辅助调试器 import { GUI } from three/addons/libs/lil-gui.module.min.js…

Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比

Pipeline 客户端将多条命令打包发送&#xff0c;服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟&#xff08;RTT&#xff09;以提升吞吐量。 需要注意的是&#xff0c;Pipeline 中的命令按顺序执行&#xff0c;但中间可能被其他客户端的命令打断。 典型场景&…