ele-h5项目使用vue3+vite开发:第一节、页面头部实现

news/2024/7/10 0:55:29 标签: vue

实现页面

确认需求

  • 顶部提示栏
  • 搜索框
  • 搜索提示

normalize.css:处理不同浏览器的默认样式

安装

  • npm i normalize.css

使用

src\App.vue


<style scoped>
@import 'normalize.css';

#app {
    /** 让字体抗锯齿,看起来更清晰 */
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
</style>

sass: CSS 预处理器

安装

  • npm i sass -D

使用


<style lang="scss" scoped>
.home-top {
  background: linear-gradient(to right, rgb(53, 200, 250), rgb(31, 175, 243));
  color: white;
  .top {
    display: flex;
    align-items: center; // 垂直居中
    padding: 10px 10px 0 10px;
    line-height: 15px;
    font-size: 15px;
    font-weight: bold;
    .location-icon {
      width: 24px;
      height: 24px;
    }
    .location {
      flex: 1;
    }
    .shopcart-icon {
      width: 24px;
      height: 24px;
    }
    .comments-icon {
      width: 28px;
      height: 24px;
      margin-left: 10px;
    }
  }
  .search-recomment {
    display: flex;
    padding: 0 10px 10px;
    .tag {
      font-size: 12px;
      border-radius: 10px;
      background: rgb(242, 242, 242, 0.3);
      padding: 2px 8px;
      margin-right: 10px;
    }
  }
}
</style>

如何使用图片

配置

  • 在vite.config.ts配置文件中配置
  • 
    import path from 'path'
    
    const resolve = (dir: string) => path.join(__dirname, dir)
    
    export default defineConfig({
    
      resolve: {
        alias: {
          '@': resolve('src')
        }
      }
    
    })
    

使用


<template>
  <div class="home-top">
    <div class="top">
      <img class="location-icon" src="@/assets/imgs/index_page/location.png" />
      <div class="location">幸福小区(东南门)</div>
      <img class="shopcart-icon" src="@/assets/imgs/index_page/shopcart.png" />
      <img class="comments-icon" src="@/assets/imgs/index_page/comments.png" />
    </div>
    <VanSearch
      shape="round"
      background="linear-gradient(to right, rgb(53,200,250), rgb(31,175,243))"
      placeholder="世界茶饮 35减2"
    >
      <template #right-icon>
        <div>搜索</div>
      </template>
    </VanSearch>
    <div class="search-recomment">
      <div v-for="v in recomments" :key="v.value" class="tag">{{ v.label }}</div>
    </div>
  </div>
</template>

封装 TheTop 组件

创建组件

  • 在src\views\tabs\home目录下创建components文件夹
  • 在文件夹中创建TheTop.vue组件
  • <script setup lang="ts">
    import type { ISearchRecomment } from '@/types'
    interface IProps {
      recomments: ISearchRecomment[]
    }
    
    defineProps<IProps>()
    </script>
    
    <template>
      <div class="home-top">
        <div class="top">
          <img class="location-icon" src="@/assets/imgs/index_page/location.png" />
          <div class="location">幸福小区(东南门)</div>
          <img class="shopcart-icon" src="@/assets/imgs/index_page/shopcart.png" />
          <img class="comments-icon" src="@/assets/imgs/index_page/comments.png" />
        </div>
        <VanSearch
          shape="round"
          background="linear-gradient(to right, rgb(53,200,250), rgb(31,175,243))"
          placeholder="世界茶饮 35减2"
        >
          <template #right-icon>
            <div>搜索</div>
          </template>
        </VanSearch>
        <div class="search-recomment">
          <div v-for="v in recomments" :key="v.value" class="tag">{{ v.label }}</div>
        </div>
      </div>
    </template>
    
    <style lang="scss" scoped>
    .home-top {
      background: linear-gradient(to right, rgb(53, 200, 250), rgb(31, 175, 243));
      color: white;
      .top {
        display: flex;
        align-items: center; // 垂直居中
        padding: 10px 10px 0 10px;
        line-height: 15px;
        font-size: 15px;
        font-weight: bold;
        .location-icon {
          width: 24px;
          height: 24px;
        }
        .location {
          flex: 1;
        }
        .shopcart-icon {
          width: 24px;
          height: 24px;
        }
        .comments-icon {
          width: 28px;
          height: 24px;
          margin-left: 10px;
        }
      }
      .search-recomment {
        display: flex;
        padding: 0 10px 10px;
        .tag {
          font-size: 12px;
          border-radius: 10px;
          background: rgb(242, 242, 242, 0.3);
          padding: 2px 8px;
          margin-right: 10px;
        }
      }
    }
    </style>
    
    <style lang="scss">
    .home-top {
      .van-field__right-icon {
        margin-right: 0;
      }
    }
    </style>
    

使用组件

在src\views\tabs\home\HomeView.vue文件中使用

<script setup lang="ts">
// 导入组件
import TheTop from './components/TheTop.vue'

const recomments = [
  { value: 1, label: '牛腩' },
  { value: 2, label: '红烧肉' },
  { value: 3, label: '宫保鸡丁' }
]
</script>

<template>
  <div class="home-page">
// 引用组件
    <TheTop :recomments="recomments" />
  </div>
</template>

<style>
.test {
  font-size: 39px;
}
</style>

使用 VanSearch 组件

配置

  • 在src\main.ts注册引入组件
  • // 全局注册引入组件
    import { Tabbar, TabbarItem, Search } from 'vant'
    app.use(Tabbar)
    app.use(TabbarItem)
    app.use(Search)

使用

<template>
  <div class="home-top">
    <div class="top">
      <img class="location-icon" src="@/assets/imgs/index_page/location.png" />
      <div class="location">幸福小区(东南门)</div>
      <img class="shopcart-icon" src="@/assets/imgs/index_page/shopcart.png" />
      <img class="comments-icon" src="@/assets/imgs/index_page/comments.png" />
    </div>

    <VanSearch
      shape="round"
      background="linear-gradient(to right, rgb(53,200,250), rgb(31,175,243))"
      placeholder="世界茶饮 35减2"
    >
      <template #right-icon>
        <div>搜索</div>
      </template>
    </VanSearch>

    <div class="search-recomment">
      <div v-for="v in recomments" :key="v.value" class="tag">{{ v.label }}</div>
    </div>
  </div>
</template>

使用 defineProps

定义

  • defineProps函数允许我们定义一个组件的属性。这个函数可以在组件内部使用,用于声明组件所接收的属性,并指定它们的类型、默认值等信息。

使用

<script setup lang="ts">
import type { ISearchRecomment } from '@/types'
interface IProps {
  recomments: ISearchRecomment[]
}


defineProps<IProps>()


</script>

<template>
  <div class="home-top">
    <div class="top">
      <img class="location-icon" src="@/assets/imgs/index_page/location.png" />
      <div class="location">幸福小区(东南门)</div>
      <img class="shopcart-icon" src="@/assets/imgs/index_page/shopcart.png" />
      <img class="comments-icon" src="@/assets/imgs/index_page/comments.png" />
    </div>
    <VanSearch
      shape="round"
      background="linear-gradient(to right, rgb(53,200,250), rgb(31,175,243))"
      placeholder="世界茶饮 35减2"
    >
      <template #right-icon>
        <div>搜索</div>
      </template>
    </VanSearch>
    <div class="search-recomment">

      <div v-for="v in recomments" :key="v.value" class="tag">{{ v.label }}</div>


    </div>
  </div>
</template>

定义组件的 Props

定义

  • 在Vue中,通过定义组件的props选项来声明组件的属性。属性是从父组件传递给子组件的数据,通过属性可以实现父子组件之间的通信。
  • 在Vue 3中,可以使用defineProps函数来定义组件的属性。
  • 无论是使用defineProps函数还是直接在props选项中定义属性,都可以通过父组件传递数据给子组件的方式来使用这些属性。

使用

  • 例如,在父组件中使用子组件并传递属性:
<script setup lang="ts">
import TheTop from './components/TheTop.vue'

const recomments = [
  { value: 1, label: '牛腩' },
  { value: 2, label: '红烧肉' },
  { value: 3, label: '宫保鸡丁' }
]
</script>

<template>
  <div class="home-page">

    <TheTop :recomments="recomments" />

  </div>
</template>

<style>
.test {
  font-size: 39px;
}
</style>
  • 在子组件中,我们可以通过props/defineProps对象来访问这些属性,并且引入:
<script setup lang="ts">
import type { ISearchRecomment } from '@/types'
interface IProps {
  recomments: ISearchRecomment[]
}

defineProps<IProps>()

</script>

<template>
  <div class="home-top">
    <div class="top">
      <img class="location-icon" src="@/assets/imgs/index_page/location.png" />
      <div class="location">幸福小区(东南门)</div>
      <img class="shopcart-icon" src="@/assets/imgs/index_page/shopcart.png" />
      <img class="comments-icon" src="@/assets/imgs/index_page/comments.png" />
    </div>
    <VanSearch
      shape="round"
      background="linear-gradient(to right, rgb(53,200,250), rgb(31,175,243))"
      placeholder="世界茶饮 35减2"
    >
      <template #right-icon>
        <div>搜索</div>
      </template>
    </VanSearch>
    <div class="search-recomment">

      <div v-for="v in recomments" :key="v.value" class="tag">{{ v.label }}</div>

    </div>
  </div>
</template>

声明 Props 的类型文件

声明

  • 使用defineProps<IProps>()来声明组件的属性。这会将IProps中定义的属性作为组件的属性,并提供类型检查和类型提示。

使用

<script setup lang="ts">
import type { ISearchRecomment } from '@/types'
interface IProps {
  recomments: ISearchRecomment[]
}

defineProps<IProps>()
</script>


http://www.niftyadmin.cn/n/5357509.html

相关文章

基于OpenCV的高压电力检测项目案例

一、项目背景与目标 随着高压电力设施的日益增多&#xff0c;传统的巡检方式已无法满足现代电力系统的需求。为此&#xff0c;我们决定利用计算机视觉技术&#xff0c;特别是OpenCV库&#xff0c;开发一个高压电力检测系统。目标是实现自动化、高精度的电力设备检测&#xff0c…

点云从入门到精通技术详解100篇-基于点云特征的工业机械臂六自由度抓取(中)

目录 2.3.2 硬件系统连接 2.4 软件系统(Software System) 2.5 6-DOF 抓取位姿表示(6-DOF Grasp Pose Representation)

基于腾讯云服务器搭建幻兽帕鲁服务器保姆级教程

随着网络游戏的普及&#xff0c;越来越多的玩家希望能够拥有自己的游戏服务器&#xff0c;以便能够自由地玩耍。而腾讯云服务器作为一个优秀的云计算平台&#xff0c;为玩家们提供了一个便捷、稳定、安全的游戏服务器解决方案。本文将为大家介绍如何基于腾讯云服务器搭建幻兽帕…

【Midjourney】AI绘画案例(1)龙年吉祥神兽

说明&#xff1a; 1、文中图片版权均为Midjourney所有&#xff0c;请勿用作商业用途。 2、文中图片均经过 Upscale x 4 处理。 3、由于模型原因&#xff0c;某些图片存在暇玼。 1、吉祥神兽——天马&#xff08;独角兽&#xff09; 天马消灾星。 提示词 Prompt: Sky Unicor…

SpringCloud Gateway(4.1.0) 返回503:原因分析与解决方案

文章目录 一、环境版本二、原因分析三、解决方案 一、环境版本 Versionspring-cloud-dependencies2023.0.0spring-cloud-starter-gateway4.1.0Nacosv2.3.0 二、原因分析 在 Spring Cloud Gateway 的早期版本中&#xff0c;Ribbon 被用作默认的负载均衡器。随着Spring Cloud的…

数据分析基础之《pandas(2)—基本数据操作》

一、读取一个真实的股票数据 1、读取数据 # 基本数据操作 data pd.read_csv("./stock_day.csv")data# 删除一些列&#xff0c;使数据简洁点 data data.drop([ma5,ma10,ma20,v_ma5,v_ma10,v_ma20], axis1)data 二、索引操作 1、numpy当中我们已经讲过使用索引选取…

24.Android中的列表--ListView

ListView 1.简单列表--ArrayAdapter <?xml version"1.0" encoding"utf-8"?> <ScrollView xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools&qu…

05 - 什么是路由协议

1 路由协议 路由协议&#xff08;英语&#xff1a;Routing protocol&#xff09;&#xff1a; 是一种指定数据包转送方式的网上协议。Internet网络的主要节点设备是路由器&#xff0c;路由器通过路由表来转发接收到的数据。 路由协议&#xff0c;根据转发策略进行分类&#xff…