【前端】Vue项目:旅游App-(11)city:添加热门数据、动态修改索引栏、点击跳转、显示城市

news2025/1/23 10:38:43

文章目录

    • 目标
    • 过程与代码
      • 添加热门数据
      • 热门数据样式
      • 索引栏索引
      • 监听点击、保存数据、回退
      • 首页跳转到city页、显示城市
    • 效果
    • 总代码
      • 修改的文件
      • city.js
      • currentGroupCity.vue
      • home.vue

目标

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

本篇目标:

点击城市:

在这里插入图片描述
跳转的city页面:

在这里插入图片描述

把点击的城市显示在首页:

在这里插入图片描述
注意,city页面添加了热门城市,并修改其索引。

过程与代码

添加热门数据

效果:

在这里插入图片描述

数据详情:是hotCities中的每一个元素。

在这里插入图片描述
数据包含Id、name等:

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

<!-- 热门 -->
<van-index-anchor index="热门" />
<div class="hot">    
    <template v-for="(item,index) in currentGroup?.hotCities" :key="index">
        <div class="hotItem">
            {{ item.cityName }}
        </div>
    </template>
</div>

效果:以国内数据为例。

在这里插入图片描述

热门数据样式

.hot{
    display: flex;
    // 允许换行
    flex-wrap: wrap;
    padding: 18px 0;
    margin-right: 20px;

    .hotItem{
        height: 28px;
        width: 60px;
        line-height: 28px;
        text-align: center;

        background-color: #fff4ec;
        border-radius: 15px;
        margin: 8px 5px;

        font-size: 13px;
    }
}

效果:这样也挺好看的。不求跟之前那个一样(之前那个也是随便写的)

在这里插入图片描述

索引栏索引

关于索引栏的索引,有几个问题:

  • 热门要添加对应的索引,否则会串,对应到A
  • 默认的索引是A-Z,但可能不存在某些字母开头的城市,如V
  • 索引的值应当是数据中的Group的值

文档索引indexList:

在这里插入图片描述
实际需要的索引数值:

在这里插入图片描述
html:

<van-index-bar :index-list="indexList">

js:

import { computed } from 'vue';

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

const indexList = computed(() => {
    // cities是一个数组
    const list = props.currentGroup.cities.map(item => item.group)
    list.unshift('#')
    return list
})

效果:索引对应正确。

在这里插入图片描述

监听点击、保存数据、回退

先试试能不能在组件中监听点击事件。若尝试后发现可以,我们就直接这么写;若不行,则使用组件提供的相关事件。

这里可以。

如何将点击的数据传到首页呢?答案是:store。

在store/modules/city的state中添加对象currentCity,用来表示当前点击的数据:要设置默认值,否则第一次城市显示为空

state: () => {
    return {
        allCity: {},
        currentCity:{
            // 默认值
            cityName:'广州',
        }
    }
}

点击事件时修改currentCity:可以直接赋值item,而不是item.cityName。
因为在服务器中一般用id来代表数据,而页面又可能需要显示除了id之外的数据,所以我们赋值整个对象。
还要写回退。

点击事件cityClick

const cityStore=useCityStore()
const route=useRouter()
function cityClick(item){
    cityStore.currentCity=item
    // 回退
    route.back()
}

首页跳转到city页、显示城市

跳转:router-link to

代码:

<div class="city">
   <router-link to="/city">{{ cityStore.currentCity.cityName }}</router-link>
</div>

效果

在这里插入图片描述

总代码

修改的文件

在这里插入图片描述

city.js

state添加currentCity。

// city.vue页面所有的进行网络请求和数据都封装到这里
import { getAllCity } from "@/service";
import { defineStore } from "pinia";

const useCityStore = defineStore('city', {
    state: () => {
        return {
            allCity: {},
            currentCity:{
                // 默认值
                cityName:'广州',
            }
        }
    },
    actions: {
        // 调用网络请求
        async fetchAllCity() {
            const res = await getAllCity()
            this.allCity = res.data
        }
    }
})

export default useCityStore

currentGroupCity.vue

添加热门,修改索引,新增点击事件:点击城市、保存数据、回退。

<template>
    <van-index-bar :index-list="indexList">
        <!-- 热门 -->
        <van-index-anchor index="热门" />
        <div class="hot">
            <template v-for="(item, index) in currentGroup?.hotCities" :key="index">
                <div class="hotItem" @click="cityClick(item)">
                    {{ item.cityName }}
                </div>
            </template>
        </div>
        <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" @click="cityClick(itemm)" />
            </template>
        </template>
    </van-index-bar>
</template>

<script setup>
import { computed } from 'vue';
import useCityStore from '@/store/modules/city'
import { useRouter } from 'vue-router';

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

const indexList = computed(() => {
    // cities是一个数组
    const list = props.currentGroup.cities.map(item => item.group)
    list.unshift('#')
    return list
})

const cityStore=useCityStore()
const route=useRouter()
function cityClick(item){
    cityStore.currentCity=item
    // 回退
    route.back()
}
</script>

<style lang="less" scoped>
.hot {
    display: flex;
    // 允许换行
    flex-wrap: wrap;
    padding: 18px 0;
    margin-right: 20px;

    .hotItem {
        height: 28px;
        width: 60px;
        line-height: 28px;
        text-align: center;

        background-color: #fff4ec;
        border-radius: 15px;
        margin: 8px 5px;

        font-size: 13px;
    }
}
</style>

home.vue

点击跳转到city页,显示选中的城市。

<template>
    <div class="home">
        <div class="nav-bar">
            <div class="title">旅游App</div>
            <div class="banner">
                <img src="@/assets/img/home/banner.webp" alt="">
            </div>
            <div class="location">
                <div class="city">
                    <router-link to="/city">{{ cityStore.currentCity.cityName }}</router-link>
                </div>
                <div class="position">
                    <div class="text">我的位置</div>
                    <img src="@/assets/img/home/icon_location.png" alt="">
                </div>
            </div>
        </div>

    </div>
</template>

<script setup>
import useCityStore from '../../store/modules/city';

const cityStore = useCityStore()
</script>

<style lang="less" scoped>
.home {
    .nav-bar {
        .title {
            height: 46px;

            // flex居中,以后左右有东西可以直接加
            display: flex;
            align-items: center;
            justify-content: center;

            color: var(--primary-color);
            font-size: 16px;
            font-weight: 700;
        }

        .banner {

            // 图片本身大很多,让它大小刚好
            img {
                width: 100%;
            }
        }

        .location {
            height: 44px;

            display: flex;
            align-items: center;
            padding: 0 20px;
            color: #53565c;

            .city {
                // flex:1 === flex:1 1 auto 除了position之外的剩余部分都属于city
                flex: 1;
            }

            .position {
                width: 74px;

                display: flex;
                align-items: center;

                .text {
                    font-size: 12px;
                }

                img {
                    width: 20px;
                    margin-left: 5px;
                }
            }
        }
    }
}
</style>

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

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

相关文章

【Kubernetes 企业项目实战】01、使用 kubeadm 安装 K8s-v1.23 高可用集群

目录 K8s-v1.23 安装环境规划 kubeadm 和二进制安装 k8s 适用场景分析 一、初始化安装 k8s 集群的环境 1.1 初步的环境初始化 1.2 配置主机之间无密码登录 1.3 关闭交换分区 swap 提升性能 1.4 修改机器内核参数 1.5 配置阿里云的 repo 源 1.6 配置安装 k8s 组件需要…

python调试器 ipdb

文章目录1. 介绍1.1 常用调试方式1.2 安装 ipdb2. 用法3. 命令3.1、查看源代码3.2、添加断点3.3 添加临时断点3.4 清除断点3.5、打印变量值3.6、逐行调试命令3.7、非逐行调试命令3.8 跳出函数&#xff0c;跳入函数3.9、查看当前函数所有参数3.10 打印变量的值3.11、打印变量类型…

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

【openGauss】在openEuler(ARM架构)上安装openGauss(单机版)

一、系统版本介绍 当前案例中的openGauss安装&#xff0c;底层操作系统为openEuler-20.03-LTS版本&#xff0c;当前openGauss对Python版本兼容性最好的是Python 3.6版本与Python 3.7版本&#xff0c;该实验使用的openEuler版本自带Python 3.7.4&#xff0c;不需要再自行安装 二…

光电探测器怎么选

想要挑选光电探测器&#xff0c;首先应该理解探测器的重要的几个指标。 实际看一个光电探测器吧 输入输出接口三个部分&#xff0c;光纤输入&#xff0c;射频输出&#xff0c;电源供电 数据手册 捡几个难理解的说说&#xff0c;详细推导解释这里不赘述了&#xff0c;难理解的…

【二】Netty 搭建简单的http服务

Netty 搭建简单的http服务Netty 简介代码展示netty 依赖NettyServer netty 服务端启动类MyChannelInitializer 设置编码解码器&#xff0c;并添加自己的业务方法MyClientHandler 实现自己的业务方法。主要方法 是读取到数据后处理效果展示服务端打印截图采用Postman 测试 截图N…

JDBC 实现增删改查的实际操作,很简单

大家好&#xff0c;今天给大家分享一下JDBC 实现增删改查的实际操作 我们还是使用的Maven的方式&#xff0c; 首先要创建一个干净的Maven webapps项目 看这个就可以了 要导入相关的依赖 <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connec…

如何使用 HTML5 Web 连接到 VMware vSphere Hypervisor

本文将向你展示如何在计算机上连接 VMware vSphere Hypervisor 7.0.3,VMware vSphere Hypervisor 7.0.3 也称为 ESXi 7.0.3。 连接 ESXi 7.0.3 下载工具以管理 ESXi 主机服务器连接 ESXi 7.0.3 服务器下载工具以管理 ESXi 主机服务器 现在不需要任何工具来管理 ESXi 7.0.3,从…

1.8周报

SourceURL:file:///home/mrl/文档/1.8周报.docx 周报 代码行数&#xff1a; 周一 611 周二 672 周三 524 周四 528 周五 450 周六 545 周日 564 遇到的问题&#xff1a; 系统配置问题&#xff1a; 在升级安装python3时&#xff0c;由于操作失误&#xff0c;导…

数据脱敏实战经验

1. 创建隐私数据类型枚举&#xff1a;PrivacyTypeEnum2. 创建自定义隐私注解&#xff1a;PrivacyEncrypt3. 创建自定义序列化器&#xff1a;PrivacySerializer4. 隐私数据隐藏工具类&#xff1a;PrivacyUtil5. 注解使用这两天在整改等保测出的问题&#xff0c;里面有一个“用户…

如何将.md文件转换为pdf

目录 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&#xff09; 2.step2&#xff1a; 安装定制化插件 3.step3&#xff1a; 进入预览窗口模式 4.step4&#xff1a; 进行格式转换 1.step1&#xff1a; 安装Visual Studio Code&#xff08;简称VScode&a…

【实战篇】39 # 如何实现世界地图的新冠肺炎疫情可视化?

说明 【跟月影学可视化】学习笔记。 世界地图新冠肺炎疫情可视化 下面将实现世界地图新冠肺炎疫情可视化。数据用的是从 2020 年 1 月 22 日到 3 月 19 日这些天的新冠肺炎疫情进展。效果类似下图&#xff1a;https://covid19.who.int/ 步骤一&#xff1a;准备世界地图可视化…

[ 数据结构 ] 迪杰斯特拉算法(最短路径问题)

0 最短路径问题 战争时期&#xff0c;胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在有六个邮差&#xff0c;从 G 点出发&#xff0c;需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#…

不透明度和填充的区别

提纲 1、不透明度和填充的相同之处 2、不透明度和填充的不同之处 3、从字面意思理解不透明度和填充 1、不透明度和填充的相同之处 在初学PS时&#xff0c;一定对“不透明度”和“填充”非常迷惑&#xff0c;它们在图层面板的这个位置 这篇就来详细聊聊这两个滑块&#xff0…

SSR是什么?Vue中怎么实现?

一、是什么 Server-Side Rendering 称其为SSR&#xff0c;意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术&#xff0c;发送到浏览器&#xff0c;然后为其绑定状态与事件&#xff0c;成为完全可交互页面的过程 先来看看Web3个阶段的发展史&#xff1a; 传…

Dart基础

一、dart概述 Dart简介 Dart 是谷歌开发的&#xff0c;类型安全的&#xff0c;面向对象的编程语言&#xff0c;被应用于Web、服务器、移动应用和物联网等领域。Dart 诞生于 2011 年 10 月 10 日Dart简单易学(类似TypeScript, 是强类型的语言)运行方式 原生虚拟机(Dart 代码可…

从执行者到管理者的角色转变

前言 在职场中因为岗位职责的差异&#xff0c;我们通过被分为两种角色&#xff0c;即执行者和管理者&#xff1b;大部分管理者也是从执行者晋升来的。 因为思维的惯性&#xff0c;导致我们会很容易带着执行者的意识去做管理&#xff0c;遇到问题就会想着自己动手去做&#xff0…

智慧防雷+智能防雷的综合应用方案

随着物联网时代的到来&#xff0c;信息共享成为社会运转的动力&#xff0c;伴随着现代建筑、交通、医疗以及工业制造等行业的智能化&#xff0c;大量微电子网络、自动化设备、计算机等投入使用&#xff0c;其集成度高、工作电压小、工作电流低、绝缘强度低、耐过电压和过电流能…

HDMI接口电路设计

HDMI是一个能传输高清视频和多声道音频的接口&#xff0c;常用的有TYPE A&#xff0c;TYPEC&#xff0c;和TYPE D的HDMI&#xff0c;最常用的是这种TYPE A的HDMI接口&#xff0c;这个是母座HDMI TYPE A插座的引脚信号定义大家可以看下&#xff0c;总共包含19个引脚。其中TMDS d…

Hudi的核心概念 —— 索引(Index)

文章目录原理索引选项全局索引与非全局索引索引的选择策略原理 Hudi 通过索引机制提供高效的 upserts&#xff0c;具体是将给定的 hoodie key(record key&#xff08;记录键&#xff09; partition path)与文件 id&#xff08;文件组&#xff09;建立唯一映射。这种映射关系&…