【前端】Vue项目:旅游App-(9)city:固定tab栏、内容中显示数据

news2025/1/11 18:46:43

文章目录

    • 目标
    • 过程与代码
      • Tab一直显示的两种方法
        • 方法1:fixed定位
        • 方法2:设置height和overflow-y(效果不好)
      • content显示数据
    • 效果
    • 总代码
      • city.vue
    • 相关参考

目标

上一篇获取了服务器中的数据:【前端】Vue项目:旅游App-(8)city:标签页Tabs动态数据:网络请求axios与request、数据管理store与pinia、各种封装

本篇目标:显示这些数据。

效果如下:(把两张图拼在一起了)

在这里插入图片描述

过程与代码

Tab一直显示的两种方法

我们把city.vue划分为两部分,top和content。
top部分是要一直显示的搜索框和tab栏,content部分是要显示的数据内容。

下面介绍两种一直显示top的方法。

方法1:fixed定位

我们可以把top栏定位为fixed,让它固定在屏幕的上面。

css:

.top{
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
}

写一点内容:

<div class="content">
    <template v-for="item in 100">
        <div>{{ item }}</div>
    </template>
</div>

效果:

在这里插入图片描述
显然出现了问题:1-7的部分会被遮盖住。

我们令content从top下面开始:

.content{
    margin-top: 98px;
}

效果:好。

在这里插入图片描述

方法2:设置height和overflow-y(效果不好)

直接设置content的height,并令overflow-y为auto,则会在content部分自动产生滚动条。

.content {
    height: calc(100vh-98px);
    overflow-y: auto;
}

效果:竟然出现了两个滚动条,还有一个穿到了Tab栏。这个效果不好,我们不用它。我们只需知道可以有这两种方法即可。(在一些情况下这种方法比上种方法好,视情况而定)

在这里插入图片描述

content显示数据

我们先观察一下数据的结构:

data分为cityGroup和cityGroupOverSea,分别表示国内数据和国外数据,正好对应两个Tab的content显示。这两个对象的结构是相似的。

以cityGroup为例,它是一个对象。我们要显示的数据是cities。

因此,想要拿到数据,我们要用key去找到它们。

在这里插入图片描述
我们观察之前写的代码,我们v-model绑定了一个属性TabActive:

<van-tabs v-model:active="TabActive">
    <template v-for="(value, key, index) in allCity">
        <van-tab :title="value.title"></van-tab>
    </template>
</van-tabs>

根据vant文档,它绑定的是索引值:
在这里插入图片描述
然而,我们要显示的数据是对象的属性,用索引去找数据是很不方便的,我们要想办法获取key

根据文档,有这样一个方法:

在这里插入图片描述
代码:动态绑定属性name,则双向绑定的TabActive属性的值是name,这里我们传入的是key。

<van-tabs v-model:active="TabActive">
   <template v-for="(value, key, index) in allCity">
       <van-tab :title="value.title" :name="key"></van-tab>
   </template>
</van-tabs>

F12,找到vue插件验证一下:确实如此。

在这里插入图片描述
content:

<div class="content">
    <template v-for="item in allCity[TabActive].cities">
        {{ item }}
    </template>
</div>

效果:

在这里插入图片描述
写到这里我们要思考一下,万一有时候我们没有从服务器中拿到数据该怎么办?比如以下情况:

在这里插入图片描述
这时我们会想到ES6的语法可选链运算符?.

在.之前是undefined时不会报错。

currentGroup :注意响应式

// currentGroup:当前选了哪个tab,是key值 
// allCity和TabActive都是响应式,因此要用value取到值
// computed:依赖的东西改变则重新计算,相当于令currentGroup响应式,否则它是写死的(只算一次)
const currentGroup = computed(() => allCity.value[TabActive.value])

template:

<div class="content">
    <template v-for="item in currentGroup?.cities">
        {{ item }}
    </template>
</div>

效果:不报错。

ps:这样写刷新几次之后都能从服务器拿到数据了。好怪…,我以为会有可能拿不到的

效果

在这里插入图片描述

总代码

city.vue

<template>
    <div class="city top-page">
        <div class="top">
            <!-- show-action:显示 “取消”  -->
            <van-search shape="round" v-model="value" show-action placeholder="城市/区域/位置" @search="onSearch"
                @cancel="onCancel" />
            <van-tabs v-model:active="TabActive">
                <template v-for="(value, key, index) in allCity">
                    <van-tab :title="value.title" :name="key"></van-tab>
                </template>
            </van-tabs>
        </div>
        <div class="content">
            <template v-for="item in currentGroup?.cities">
                {{ item }}
            </template>
        </div>
    </div>
</template>

<script setup>
import { computed, ref } from 'vue';
import { showToast } from 'vant';
import useCityStore from '@/store/modules/city'
import { storeToRefs } from 'pinia';

const value = ref('');
const TabActive = ref(0);
const onSearch = (val) => showToast(val);
const onCancel = () => {
    showToast('取消');
}

// tabs的数据
const cityStore = useCityStore()
cityStore.fetchAllCity()
// cityStore是响应式的
const { allCity } = storeToRefs(cityStore)
// console.log(allCity)

// currentGroup:当前选了哪个tab,是key值 
// allCity和TabActive都是响应式,因此要用value取到值
// computed:依赖的东西改变则重新计算,相当于令currentGroup响应式,否则它是写死的(只算一次)
const currentGroup = computed(() => allCity.value[TabActive.value])
</script>

<style lang="less" scoped>
.top {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
}

.content {
    margin-top: 98px;
}
</style>

相关参考

Vue中computed用法
可选链运算符(?.)

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

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

相关文章

【数据结构】完全二叉树——啊堆堆堆

一、树概念及结构树的概念树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n > 0&#xff09;个有限节点组成的一个具有层次关系的集合。把它叫做树是因为他看起来像是一颗倒挂起来的树&#xff0c;也就是说它是根朝上&#xff0c;而叶子朝下的。-> 有一个特殊的…

Find My产品|Ember发布支持苹果Find My温控马克杯

在 CES2023 展会上&#xff0c;温控马克杯制造商 Ember 表示&#xff0c;计划在 2023 年 Q2 上市一款支持苹果 Find My 应用的全新 Travel Mug 2 马克杯。 这项新功能将使用户能够在 Find My 应用中追踪 Travel Mug 2 的位置&#xff0c;就像追踪iPhone、iPad、AirPods 或其他…

埃科光电在科创板IPO过会:拟募资11亿元,董宁为实际控制人

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;合肥埃科光电科技股份有限公司&#xff08;下称“埃科光电”获得科创板上市委会议通过。据贝多财经了解&#xff0c;埃科光电于2022年6月22日在科创板提交招股书&#xff0c;并于12月29日递交招股书&#xff08;上会稿…

图像分割笔记

图像分割笔记 目标&#xff1a; 实现图像中多个物体的分割&#xff0c;多个物体的标注方式为0,1,2,3,0表示背景&#xff0c;1表示一种物体&#xff0c;2表示另一种物体&#xff0c;假设我们现在的分割任务里面有5个目标需要&#xff0c;如肺叶分割&#xff0c;5个肺叶的标注方…

飞书开放平台-全新消息卡片搭建工具

前言你还在为需要手撕 JSON 代码而烦恼吗&#xff1f;消息卡片搭建工具全新升级&#xff0c;为你带来更优雅的卡片创作体验&#xff1a;&#x1f31f; 卡片编辑&#xff1a;纯可视化操作编辑消息卡片&#xff0c;再也不用碰代码&#x1f31f; 我的卡片&#xff1a;一键保存卡片…

Vue3 Composition API

文章目录p15 Vue3 Composition APIMixin全局混入options API的弊端认识Componsition APIsetup函数的参数setup不可以使用thisReactive APIrefreadonlyp16 Composition API(二)toRefscomputedwatchEffect在setup中使用refwatchp15 Vue3 Composition API Mixin 全局混入 、 opti…

使用正则表达式删除注释

以下摘自某网友来信&#xff1a; 难点 Javascript 不支持点号匹配换行符, 因此无法直接进行多行匹配处理前面没有 http: 的 //, 当然要用否定前瞻( negative lookbehine)了:(?<!http:)\/\/. 可惜 javascript 不支持 思路 关于多行匹配 这个问题, 之前我已经说过, 要点…

多线程初阶(四)定时器及线程池

目录 前言&#xff1a; 定时器 使用标准库中定时器 模拟实现定时器 线程池 使用标准库中的线程池 代码实现 ThreadPoolExecutor类介绍 构造方法参数介绍 拒绝策略介绍 模拟实现线程池 代码实现 提出问题 小结&#xff1a; 前言&#xff1a; 这篇文章同上一篇文章…

简单实现Java定时器

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE】 &#x1f432;&#x1f432;本篇内容&#xff1a;自己实现Java定时器 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&…

【手写 Vue2.x 源码】第九篇 - 对象数据变化的观测情况

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组深层观测的实现&#xff0c;核心几个点如下&#xff1a; 最初仅对数组类型进行了原型方法重写&#xff0c;并未进行递归处理&#xff0c;所以&#xff0c;当时仅实现了数组的单层劫持&#xff1b; 通过对数组进行 observe…

二、Gtk4-GtkApplication and GtkApplicationWindow

1 GtkApplication 1.1 GtkApplication and g_application_run 人们编写编程代码来开发应用程序。什么是应用程序?应用程序是使用库运行的软件&#xff0c;其中包括操作系统、框架等。在GTK 4编程中&#xff0c;GTK应用程序是使用GTK库运行的程序(或可执行程序)。 编写GtkAp…

信创改造,你了解多少?

最近&#xff0c;“信创”一词在IT圈瞬间爆火&#xff0c;那什么是信创&#xff1f;又能带来哪些突破性的改变&#xff1f;跟随佑友一起来详细了解一下… 信创的来源 2016年3月4日&#xff0c;24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;共同发起成立了一个非…

分布式链路追踪-skywalking入门体验

背景 旁友&#xff0c;你的线上服务是不是偶尔来个超时&#xff0c;或者突然抖动一下&#xff0c;造成用户一堆反馈投诉。然后你费了九牛二虎之力&#xff0c;查了一圈圈代码和日志才总算定位到问题原因了。或者公司内部有链路追踪系统&#xff0c;虽然可以很轻松地通过监控判…

deb dpkg fpm cpack debmake 打包

文章目录deb 简介hello debfpmpreinst postinst prerm postrmcmake cpackdebmakedeb 简介 deb: Linux发行版Debian系列(如Debian, Ubuntu等)的软件包格式, 没有自提取(Self-extracting), 不能直接运行, 需要借助dpkg等安装. Dpkg: Debian Package Manager, Debian包管理器, 中…

Python读取各种形式文件(excel,txt),python基本用法

读取excel,读取结果是dataframe形式。 excelFile ranalyze_search_category.xlsx df pd.DataFrame(pd.read_excel(excelFile)) print(df) 详情&#xff1a;(21条消息) 在Python中使用Pandas.DataFrame对Excel操作笔记一 - 从Excel里面获取说需要的信息_fengqiaoxian的博客-CS…

TensorFlow之模型保存与加载

模型在训练过程中或者在训练之后&#xff0c;模型的执行过程能被保存&#xff0c;也就是&#xff0c;模型能从暂停中恢复以免训练的时间过长。因此&#xff0c;被保存的模型可以被共享&#xff0c;其他人可以重新构建相同的模型。被保存的模型以如下的两种方式进行共享&#xf…

青训营——前端方向练习题(不定项选择题例题)

文章目录 &#x1f4c4;前言 PART1 PART2 PART3 PART4 PART5 PART6 PART7 PART8 PART9 &#x1f4c4;前言 一共有十八题&#xff0c;题目选项为不定项&#xff0c;有单选&#xff0c;也有多选。 PART1 选择题 1&#xff1a; 下列哪些是 HTML5 的新特性&#xff1f; A…

Android 深入系统完全讲解(3)

3 Zygote 虚拟机的流程&#xff0c;学习方法 说完了 init 的启动过程&#xff0c;我们来说说 Zygote 的启动过程。 这里我们看下整个的步骤&#xff0c;主要完成了&#xff1a; 1 startVM() 创建虚拟机 2 startReg() 注册 JNI 方法 3 preload()预加载通用类&#xff0c;这里主…

【信管7.1】质量与质量管理过程

质量与质量管理过程对于我们的项目管理理论相关的学习来说&#xff0c;质量是除了范围、进度、成本之外的另一个核心内容。还记得我们在学习敏捷的时候讲过的项目管理三角形吗&#xff1f;通过之前的课程&#xff0c;我们已经学完了它的三个支点。接下来&#xff0c;我们就要学…

播客丨关于年终总结,程序员有话说

绘声绘影绘声绘影是网易云信独家打造的一档聚焦行业热点、个人成长方面的播客栏目。栏目希望通过邀请不同背景、不同行业、不同阅历的企业研发、产品、运营等相关岗位负责人作为节目嘉宾&#xff0c;以自身职业视角交流行业洞见和发展前景&#xff1b;以过来人的视角分享在时代…