【前端】Vue项目:旅游App-(13)home:热门数据的网络请求、store和显示

news2024/11/28 9:33:03

文章目录

    • 目标
    • 过程与代码
      • 页面html与css
      • 获取数据
        • 网络请求
        • store
      • 展示数据
    • 效果
    • 总代码
      • 修改或添加的文件
      • service的home.js
      • service的index.js
      • store的home.js
      • home.vue

本项目博客总结:【前端】Vue项目:旅游App-博客总结

目标

天河区、番禺区…等数据是动态的,数据在这里拿:123.207.32.32:1888/api/home/hotSuggests
在这里插入图片描述

过程与代码

页面html与css

先做“价格不限”、“关键字”这些。

在这里插入图片描述

html:

<!-- 价格人数 -->
<div class="price-counter section">
    <div class="left">价格不限</div>
    <div class="right">人数不限</div>
</div>

<!-- 关键字 -->
<div class="keyword section">
    <span>关键字/位置/民宿名</span>
</div>

css:

.price-counter {
   justify-content: space-between;
   height: 35px;
}

.keyword {
   height: 35px;
}

// search-box里的每个部分都加上section
// 都有类似的样式
.section {
    display: flex;
    padding: 0 20px;
    color: #999;
    margin-top: 10px;
}

效果:

在这里插入图片描述

获取数据

关于网络请求往服务器拿数据,我们在之前的博客里讲过,这里不会赘述:【前端】Vue项目:旅游App-(8)city:标签页Tabs动态数据:网络请求axios与request、数据管理store与pinia、各种封装

网络请求

首先:是把网络请求相关的代码写进service里。

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

// 此文件保存所有home页面的网络请求
import HYRequest from '@/service/request'

export function getHotSuggest() {
    // request的index导出的是一个对象
    return HYRequest.get({
        // 参数也是一个对象
        url: '/home/hotSuggests'
    })
}

把所有函数在service/index中导出:

export * from '@/service/modules/home'

store

其次:把网络请求到的数据放进store中。

在这里插入图片描述

代码:

// home.vue页面所有的进行网络请求和数据都封装到这里

import { defineStore } from "pinia";
import { getHotSuggest } from '@/service'

const useHomeStore = defineStore('home', {
    state: () => {
        return {
            hotSuggest: []
        }
    },
    actions: {
        // 网络请求,由于返回一个promise,要异步async await
        async fetchHotSuggest() {
            const res = await getHotSuggest()
            this.hotSuggest = res.data
            console.log(res)
        }
    }
})

export default useHomeStore

在控制台中看一下数据:显然我们要存的是res.data。它是一个数组,里面每个元素都是一个对象。我们需要展示的属性是对象.tagText.text

在这里插入图片描述

展示数据

html:

<!-- 热门推荐 -->
<div class="hotSuggest">
   <template v-for="(item, index) in hotSuggestData" :key="index">
       <div class="hotSuggestItem">
           {{ item.tagText.text }}
       </div>
   </template>
</div>

js:

// 热门数据
homeStore.fetchHotSuggest()
const hotSuggestData = ref(homeStore.hotSuggest)

效果:

在这里插入图片描述
加点样式:

.section {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    padding: 0 20px;
    color: #999;
    margin-top: 10px;          
}

.hotSuggest {

    .hotSuggestItem {
        
        margin: 3px;
        padding: 4px 8px;
        font-size: 12px;
        background-color: #f1f3f5;
        color: #3f4954;
        border-radius: 20px;
    }
}

在这里插入图片描述

效果

目标达成。

总代码

修改或添加的文件

在这里插入图片描述

service的home.js

写home页面所有的网络请求。

// 此文件保存所有home页面的网络请求
import HYRequest from '@/service/request'

export function getHotSuggest() {
    // request的index导出的是一个对象
    return HYRequest.get({
        // 参数也是一个对象
        url: '/home/hotSuggests'
    })
}

service的index.js

将所有service在这里集中导出。

// 此文件导入并导出所有要使用的service

export * from '@/service/modules/city'
export * from '@/service/modules/home'

store的home.js

home.vue页面所有的进行网络请求和数据都封装到这里。

// home.vue页面所有的进行网络请求和数据都封装到这里

import { defineStore } from "pinia";
import { getHotSuggest } from '@/service'

const useHomeStore = defineStore('home', {
    state: () => {
        return {
            hotSuggest: []
        }
    },
    actions: {
        // 网络请求,由于返回一个promise,要异步async await
        async fetchHotSuggest() {
            const res = await getHotSuggest()
            this.hotSuggest = res.data
            // console.log(res)
        }
    }
})

export default useHomeStore

home.vue

增加了热门数据显示。

<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>
        <div class="search-box">
            <div class="section 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 class="section time-range" :value="date" @click="showCalendar = true">
                <div class="start">
                    <span>入住</span>
                    <div class="time">
                        {{ startDay }}
                    </div>
                </div>
                <div class="stay">共{{ date }}晚</div>
                <div class="end">
                    <span>离店</span>
                    <div class="time">
                        {{ endDay }}
                    </div>
                </div>
            </div>

            <!-- 日历 -->
            <van-calendar :round="false" v-model:show="showCalendar" type="range" @confirm="onConfirm"
                :show-confirm="false" />

            <!-- 价格人数 -->
            <div class="price-counter section">
                <div class="left">价格不限</div>
                <div class="right">人数不限</div>
            </div>

            <!-- 关键字 -->
            <div class="keyword section">
                <span>关键字/位置/民宿名</span>
            </div>

            <!-- 热门推荐 -->
            <div class="hotSuggest section">
                <template v-for="(item, index) in hotSuggestData" :key="index">
                    <div class="hotSuggestItem">
                        {{ item.tagText.text }}
                    </div>
                </template>
            </div>
        </div>
    </div>
</template>

<script setup>
import useCityStore from '../../store/modules/city';
import useHomeStore from '../../store/modules/home';
import { formatMonthDay, getDiffDate } from '@/utils/formatDate'
import { ref } from 'vue';

const cityStore = useCityStore()
const homeStore = useHomeStore()
// 日期
const today = new Date()
const startDay = ref(formatMonthDay(today))
const endDay = ref(formatMonthDay(new Date().setDate(today.getDate() + 1))) //明天写法

// 日历
const date = ref('1');
const showCalendar = ref(false);

const formatDate = (date) => `${date.getMonth() + 1}/${date.getDate()}`;
const onConfirm = (values) => {
    const [start, end] = values;
    showCalendar.value = false;

    startDay.value = formatMonthDay(start)
    endDay.value = formatMonthDay(end)
    date.value = getDiffDate(start, end)
};

// 热门数据
homeStore.fetchHotSuggest()
const hotSuggestData = ref(homeStore.hotSuggest)
// console.log(hotSuggestData)
</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%;
            }
        }
    }

    .search-box {

        --van-calendar-popup-height: 100%;

        // search-box里的每个部分都加上section
        // 都有类似的样式
        .section {
            display: flex;
            flex-wrap: wrap;
            align-items: center;
            padding: 0 20px;
            color: #999;
            margin-top: 10px;          
        }

        .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;
                }
            }
        }

        .time-range {
            display: flex;
            justify-content: space-between;
            height: 45px;

            span {
                font-size: 16px;
            }

            .time {
                color: #53565c;
            }
        }

        .price-counter {
            justify-content: space-between;
            height: 35px;
        }

        .keyword {
            height: 35px;
        }

        .hotSuggest {

            .hotSuggestItem {
                
                margin: 3px;
                padding: 4px 8px;
                font-size: 12px;
                background-color: #f1f3f5;
                color: #3f4954;
                border-radius: 20px;
            }
        }
    }
}
</style>

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

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

相关文章

智能物流仓储机器人|海格里斯HEGERLS货物夹抱式防倾倒装置四向穿梭车

在电商以及物流服务行业迅猛发展的当下&#xff0c;自动化立体仓库表面了更加强大的生命力与适应能力。谋求人力节省以及长远发展的电商也需要自动化立体仓库来帮助他们实现这一目标。在现有的技术中会利用穿梭车进行货物转运&#xff0c;但是在转运过程中&#xff0c;由于货物…

浅谈Web渗透

中华人民共和国网络安全法 第二十七条 任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动:不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具&#xff0c;明知他人从事危…

“一秒”读懂串扰对信号传输时延的影响

作者&#xff1a;一博科技高速先生成员 刘春在前几期的文章“为什么DDR走线要走同组同层&#xff1f;”中&#xff0c;我们了解了信号在传输线上的传输速度以及微带线与带状线传输的时延差异。同时也有很多热情的网友对影响传输线时延情况给出了各自的见解&#xff0c;比如串扰…

经营性房产的管理范围

经营性房屋是指商业用房或生产用房&#xff0c;是学校出租给外单位使用的房屋&#xff0c;数图互通经营性房屋管理功能范围包括&#xff1a; 定义经营性房屋&#xff08;范围&#xff09;&#xff1a;定义那些房产是可以租赁。 租赁房屋基本信息&#xff1a;建立商铺&#xff…

【ArcGIS Pro微课1000例】0025:大型商场选择典型案例(缓冲区分析+叠置分析)

文章目录 一、实验分析二、实验数据三、实验过程一、实验分析 合理的商场位置有利于商家营业,方便人们购物。商场选址问题需要考虑很多因素,如地理位置、居民点分布、停车场分布、交通情况等。综合把握这些影响因素对商场的选址显得尤为重要。 二、实验数据 加载专栏实验数…

赞赞赞!融云收获行业媒体「组团打 Call」

近期&#xff0c;融云又收获了来自行业和媒体的一波集中“点赞”&#xff0c;分别是—— 产品方面来自掘金的年度创新产品奖&#xff1b; 技术方面来自思否的年度技术团队、掘金的人气技术团队荣誉&#xff1b; 出海方面入选爱分析出海通信厂商全景报告。 打 Call 组团来袭…

revit绘制扶手楼梯生成,转角断开怎么解决?

一、Revit中楼梯扶手连接技巧 在用revit绘制楼梯时扶手可自动生成&#xff0c;但是生成的楼梯扶手在转角处却是断开的。 通常有几种情况&#xff0c;如图1所示情况 碰到这种情况时&#xff0c;可以选择楼梯扶手然后点编辑命令&#xff0c;将原有的楼梯扶手线向后移动一定的距离…

手把手教你如何通过Java给图片添加文字和图片水印

前言 最近工作上有个需求&#xff0c;动态生成一张图片&#xff0c;具体来说就是基于模版图片动态添加文字和图片&#xff08;文字内容不同&#xff0c;图片数目不同&#xff09;&#xff0c;其中文字大小不全一样&#xff0c;且对位置有所要求。 本文将剖析多个技术方案来实…

ElementUI

一、axios拦截器1、axios模块的作用&#xff1a;是对基于http请求的封装。在浏览器对异步请求对象XMLHttpRequest进行封装2、拦截器&#xff1a;&#xff08;1&#xff09;请求拦截器&#xff1a;对客户端发起的请求进行统一的前期处理&#xff08;token、时间戳、cookie等&…

【Maven自动化构建工具】 | 项目管理工具

目录 第1章&#xff1a;Maven简介 1. 传统项目开发存在的问题 2. Maven 概述 3. Maven核心概念 4. 安装 Maven 环境 第2 章 Maven 的核心概念 1. Maven 工程约定目录结构 2. 仓库概念 3. POM文件 4. 坐标 5. 依赖 6. Maven的生命周期、命令和插件 第 3 章 Maven…

[JavaEE初阶] 内存可见性问题----volatile与wait(),notify()的使用

读书要趁黑发早,白首不悔少当时 文章目录1. 什么是内存可见性问题2. 避免内存可见性问题-----volatile(易变的)3. 需要注意的点4. wait()与notify()的使用4.1 控制两个线程执行顺序4.2 控制多个线程执行顺序4.3 wait()与sleep()的区别总结1. 什么是内存可见性问题 在线程A在读…

后端人眼中的Vue(四)

七、Vue生命周期 ​ Vue的生命周期指的是Vue实例在页面中创建到销毁整个过程。Vue提供了在各个生命周期的钩子&#xff0c;钩子也叫Vue生命周期函数。这些生命周期函数是伴随着Vue实例创建、销毁的过程中自动触发的&#xff08;不需要人为手动触发&#xff09;。Vue实例生命周期…

Leetcode:106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树(C++)

目录 106. 从中序与后序遍历序列构造二叉树&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 切割法&#xff08;递归&#xff09;&#xff1a; 原理思路&#xff1a; 索引版本&#xff1a; 105. 从前序与中序遍历序列构造二叉树&#xff1a; 问题描述&am…

zookeeper单节点部署

kafkazookeeper单节点部署及注意事项 事前准备&#xff1a; 1、一台Linux服务器或者是一台虚拟机 2、准备好JDK环境 3、安装好wget&#xff08;当然也可以不用这个&#xff0c;只是用于下载安装包的一个工具&#xff0c;所以能下载好包就是没问题的&#xff09; 4、需要了解vim…

Java面试题每日10问(4)

Core Java - OOPs Concepts: Inheritance Interview Questions 1. Why use inheritance in java? For Method Overriding (so runtime polymorphism can be achieved).For Code Reusability. Terms used in Inheritance Class: –A class is a group of objects which have c…

皕杰报表点击导出按钮后网页变空白问题

有人反映使用皕杰报表导出时&#xff0c;点击导出按钮后网页变成了空白&#xff0c;然后就没有反应了。看tomcat控制台也没有错误信息&#xff0c;似乎遇到了一个很难缠的问题&#xff0c;没有错误信息却卡滞了&#xff0c;这个问题怎么解决呢&#xff1f; 还是要从tomcat的日志…

盘点微服务架构下的诸多身份验证方式

联合作者&#xff1a;罗泽轩&#xff0c;API7.ai 技术专家、Apache APISIX PMC 成员 联合作者&#xff1a;赵士瑞&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Committer 身份认证是授予用户访问系统并授予使用系统的必要权限的过程。而提供了这一功能的服务&…

指针详解——高级指针的解析及应用

目录 &#x1f411;指针的初步了解 &#x1f402;指针的深入认识 &#x1f99b;1.指针数组 &#x1f400;指针数组的介绍 &#x1f400;指针数组的用法介绍 &#x1f42b;2.数组指针 &#x1f98c;数组指针的介绍以及使用 &#x1f9ae;3.函数指针 &#x1f408;函数指针的介绍…

Linux0基础入门:初识shell脚本编程

初识脚本编程到目前为止我们已经知道了 Linux 系统和命令行的基础知识&#xff0c;是时候开始编程了。本章讨论编写 shell 脚本的基础知识。在开始编写自己的 shell 脚本大作前&#xff0c;你必须了解这些基本概念。 使用多个命令到目前为止&#xff0c;你已经了解了如何使用 s…

Revit连接处理:阳台扶手和楼梯扶手,墙和梁

一、Revit中阳台扶手和楼梯扶手的连接处理 如图&#xff0c;有一些阳台扶手和楼梯扶手连接的地方&#xff0c;连接处需要进行处理。 1.在楼板合适的边缘处先画出楼梯 (1)单击“楼梯” (2)在楼梯类型属性对话框中修改楼梯属性 (3)绘制楼梯 为了定位方便、准确&#xff0c;首先要…