【前端】Vue项目:旅游App-(10)city:以indexBar的形式显示数据

news2024/11/29 22:33:21

文章目录

    • 目标
    • 过程与代码
      • 分析数据并展示
      • 封装到一个组件
      • 添加indexBar
      • 样式修改
      • 优化tab栏的切换
    • 效果
    • 总代码
      • 修改或新增的文件
      • common.css
      • city.vue
      • currentGroupCity.vue
      • main.js

目标

上一篇显示了服务器中的数据:【前端】Vue项目:旅游App-(9)city:固定tab栏、内容中显示数据

本篇目标:将数据展示成这个效果。

在这里插入图片描述

过程与代码

分析数据并展示

首先我们要分析要展示的数据。以国内数据为例:

数据分为citieshotcitiestitle。我们这里要展示的是cities

在这里插入图片描述

cities详情:是一个数组,里面的每一个元素都是一个对象。
每个对象有两个属性:

  • group:表示以本字母开头
  • cities:一个数组,表示以group开头的所有城市

这就是我们要展示的数据。显然需要两层循环。

在这里插入图片描述
在这里插入图片描述
代码:

<div class="content">
  <template v-for="(item,index) in currentGroup?.cities" :key="index">
      <h2 class="title">
          标题{{ item.group }}
      </h2>
      <div class="cities">
          <template v-for="(itemm,indexx) in item.cities" :key="indexx">
              <div class="cityName">
                  {{ itemm.cityName }}
              </div>
          </template>
      </div>
  </template>
</div>

效果:

在这里插入图片描述

封装到一个组件

为了代码的可维护性,封装一下。

currentGroupCity.vue:

<template>
    <template v-for="(item, index) in currentGroup?.cities" :key="index">
        <h2 class="title">
            标题{{ item.group }}
        </h2>
        <div class="cities">
            <template v-for="(itemm, indexx) in item.cities" :key="indexx">
                <div class="cityName">
                    {{ itemm.cityName }}
                </div>
            </template>
        </div>
    </template>
</template>

<script setup>
// 定义数据currentGroup:一个对象
defineProps({
    currentGroup: {
        type: Object,
        default: () => ({})
    }
})
</script>

<style lang="less" scoped>
h2{
    font-size: 20px;
    font-weight: 700;
}
</style>

city.vue把数据传一下:

<div class="content">
   <currentGroupCity :current-group="currentGroup"/>
</div>

添加indexBar

数据已经展示好了,我们还要添加样式。要添加的样式叫做:IndexBar 索引栏 - Vant 4 (gitee.io)

注册好后,根据indexBar的代码进行修改。

在这里插入图片描述
代码:

<template>
    <van-index-bar>
        <template v-for="(item, index) in currentGroup?.cities" :key="index">
            <van-index-anchor :index="item.group" />
            <template v-for="(itemm, indexx) in item.cities" :key="indexx">
                <van-cell :title="itemm.cityName" />
            </template>
        </template>       
    </van-index-bar>
</template>

效果:

在这里插入图片描述
出了一些bug:

Failed to resolve component: van-cell
If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.

解决方法:【vue】Failed to resolve component: van-cell If this is a native custom element, make sure to exclude

效果:

在这里插入图片描述

样式修改

把颜色改成主题色橙色。具体步骤见之前的博客,不再赘述。

common.css的:root:

--van-primary-color:var(--primary-color) !important;

还有一件事:我们的滚轮往下滑的时候索引栏会被挡住:

在这里插入图片描述
给类top增加z-index:

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

    // 不被indexBar挡住
    z-index: 9;
}

当然,让它被挡住也行,具体看产品的需求。这里只是写一下如果不让他被挡住的方法。

优化tab栏的切换

写到这里我们发现,每点一次tab栏的切换,数据就会重新加载。这样的效率其实是不高的。

在这里插入图片描述

我们可以这样做:把两份数据都写出来,用v-show显示对应的数据。就像前面对title所做的一样。

<div class="content">
    <template v-for="(value, key, index) in allCity">
        <currentGroupCity v-show="key===TabActive" :current-group="value" />
    </template>
</div>

切换的直观感受:快了一些。虽然数据上差别不大。
在这里插入图片描述

效果

在这里插入图片描述

总代码

修改或新增的文件

在这里插入图片描述

common.css

修改了样式:主题颜色。

:root {
    --van-primary-color:var(--primary-color) !important;
}

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="(value, key, index) in allCity">
                <currentGroupCity v-show="key===TabActive" :current-group="value" />
            </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';
import currentGroupCity from './cpns/currentGroupCity.vue';

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])

console.log(currentGroup)
</script>

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

    // 不被indexBar挡住
    z-index: 9;
}

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

currentGroupCity.vue

循环显示数据的组件。

<template>
    <van-index-bar>
        <template v-for="(item, index) in currentGroup?.cities" :key="index">
            <van-index-anchor :index="item.group" />
            <template v-for="(itemm, indexx) in item.cities" :key="indexx">
                <van-cell :title="itemm.cityName" />
            </template>
        </template>       
    </van-index-bar>
</template>

<script setup>
// 定义数据currentGroup:一个对象
defineProps({
    currentGroup: {
        type: Object,
        default: () => ({})
    }
})
</script>

<style lang="less" scoped>
h2 {
    font-size: 20px;
    font-weight: 700;
}
</style>

main.js

引入组件。

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

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

相关文章

(九)devops持续集成开发——jenkins流水线发布一个docker版的前端vue项目

前言 本节内容主要介绍如何使用jenkins的流水线发布一个docker版的前端项目。关于本节内容中使用到的jenkins的组件&#xff0c;请参考往期博客内容&#xff0c;自行安装。我们使用NodeJS完成前端项目的编译安装&#xff0c;使用ssh组件完成编译后工程的传输&#xff0c;以及d…

Allegro如何快速复制铜皮到其它层面的两种方法详细操作指导

Allegro如何快速复制铜皮到其它层面的两种方法详细操作指导 在做PCB设计的时候,通常需要复制一个做好的铜皮到其它层面,如下图 需要把L3层的铜皮复制到其它的内层 Allegro支持快速将铜皮拷贝到其它层,下面介绍两种方法,具体操作如下 方法一 选择Edit

快速生成100万条数据并存入mysql数据库(1):游戏人物数据

最近正在一直苦恼如果去获取更多的数据以用来进行后期的查询和进行测试&#xff0c;发现了Navicat这个不错的宝藏&#xff0c;他可以一下子根据你数据库里面创建的各种各样的字段和约束创建出各种各样你自己想要的大量数据&#xff0c;当然这些数据非真实数据而是虚拟数据&…

Swin Transformer原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了&#xff01; CV攻城狮入门VIT(vision transformer)之旅——VIT原…

Nacos多级服务存储模型, NacosRule负载均衡规则入门

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 NacosRule负载均衡规则 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 ♨️如…

【毕设必备】Python制作GUI学生管理系统,这把直接稳赢

前言 最近有个朋友说&#xff0c;能不能让我搞个学术上管理系统出来&#xff0c;想自己用用&#xff0c;好朋友嘛&#xff0c;那就搞个给他用用咯 之前还有个小朋友说&#xff0c;想弄个出来发给老师&#xff0c;让老师表扬一下自己哈哈哈 话说&#xff0c;这个还是可以做毕…

基于微信小程序的高校毕业论文管理系统小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

深入剖析B端产品权限设计-功能权限设计篇

权限设计是B端产品永远绕不开的一个课题&#xff0c;良好的产品权限设计架构是支撑企业复杂业务的基础与关键。接下来会分两篇文章剖析产品权限管理&#xff0c;一篇分享功能权限管理&#xff0c;一篇分享数据权限管理。一、什么是权限管理权限管理&#xff0c;一般指根据系统设…

1.9第三周星期一

LAMP环境搭建 1. 下载 yum install gcc gcc-c cmake ncurses ncurses-devel bison wget openssl-devel -y rpm -qa | grep mysql rpm -qa| grep mariadb yum install gcc gcc-c cmake ncurses ncurses-devel bison wget openssl-devel -y 2.建立mysql 组&#xff0c;<--新…

Linux常用命令与常见操作:重启服务器

Linux系统运维经验 Xshell prompt与Linux 【Linux】【CentOS】xshell连接Linux虚拟机 Linux linux常用命令 常见操作 升级补丁后重启服务器 cd /opt/zc/ nohup ./startup-linux.sh &有36、37两台服务器&#xff0c;37直接执行上面2条语句即可重启成功。 36这台服务器…

【计算机网络】网络基础

目录前言一、计算机网络发展二、初识“协议”1. 协议的概念2. 协议分层三、OSI七层模型四、TCP/IP五层(四层)模型五、网络传输基本流程1. 网络传输流程图2.数据包封装和分用六、网络中的地址管理1. IP地址2. MAC地址前言 本文是博主首次学习网络知识后进行的总结&#xff0c;文…

毫米波雷达「战火」升级

车载毫米波雷达市场的「战火」&#xff0c;也在快速蔓延到行业上游。 比如&#xff0c;雷达SoC&#xff08;新一代RF CMOS&#xff09;集成化趋势。这意味着&#xff0c;毫米波雷达芯片方案商一次性集成射频前端、雷达信号处理基带和微处理器以及其他元器件&#xff08;包括电源…

文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128626548 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

Docker | 深度学习中的docker看这一篇就够啦

目录 1.了解Docker 1.1.为什么要用docker? 1.2.可以用docker做什么? 1.3.docker 框架 2.Docker 的基本使用 3.实例 :VS code远程连接服务器上的docker环境 3-1:环境框架可视化及ssh连接&#xff0c;搭建pytorch深度学习环境 3-2:搭建一个新的容器pytorch深度学习环境…

北大硕士LeetCode算法专题课-数组相关问题

算法专题&#xff1a; 北大硕士LeetCode算法专题课---算法复杂度介绍_骨灰级收藏家的博客-CSDN博客 北大硕士LeetCode算法专题课-基础算法之排序_骨灰级收藏家的博客-CSDN博客 北大硕士LeetCode算法专题课-基础算法查找_骨灰级收藏家的博客-CSDN博客 数组相关问题 双指针 …

20-FreeRTOS队列API函数

1- xQueueCreate queue. hQueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,UBaseType_t uxItemSize );创建一个新队列并返回 可引用此队列的句柄。 configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中被设置为 1&#xff0c;或保留未定义状态&#xff08;此…

ShardingSphere分库分表schema名称导致NPE问题排查记录

前段时间把 ShardingSphere 升级到了 5.1.1 版本&#xff0c;奈何官方版本升级太快跟不上速度&#xff0c;这不最近又发现了一个 BUG。 问题现象 数据库做了分库分表&#xff0c;在需要查询多表数据进行 merge 的时候发生了一个 NPE 的异常。 Caused by: java.lang.NullPoin…

【数据结构】前缀树/字典树

目录1.概述2.代码实现3.应用本文参考&#xff1a; LeetCode 208.实现 Trie (前缀树) 1.概述 前缀树又称字典树、Trie 树、单词查找树&#xff0c;是一棵有根树&#xff0c;同时也是一种哈希树的变种&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 chi…

pytorch 分布式调试debug torch.distributed.launch

文章目录一. pytorch 分布式调试debug torch.distributed.launch 三种方式1. 方式1&#xff1a;ipdb调试&#xff08;建议&#xff09;命令行使用pdb未解决&#xff1a;2. 方式2&#xff1a;使用pycharm进行分布式调试&#xff08;侵入式代码&#xff09;3. 方式3&#xff1a;使…

HRNet源码阅读笔记(5),庞大的PoseHighResolutionNet模块-transition1

在stage1的最后&#xff0c;分支了。就是所谓的transition1&#xff0c;详见下面的第13行。def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self.layer1(x)x_list []for i in range(self.stage2_cfg[NU…