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

news2024/11/30 0:42:56

实现页面

确认需求

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

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.coloradmin.cn/o/1432185.html

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

相关文章

Elasticsearch(ES) 简述请求操作索引下文档 增删查改操作

上文 Elasticsearch(ES) 创建带有分词器规则的索引 带着大家创建了一个带有分词功能的索引 老规矩 我们启动一下ES服务 本文 我们就来说说 关于文档的操作 我们先来添加一个文档 就像数据库加一条数据一样 这里 并不需要指定什么表结构和数据结构 它的文档结构是无模式的 添…

Python新春烟花盛宴

写在前面 哈喽小伙伴们&#xff0c;博主在这里提前祝大家新春快乐呀&#xff01;我用Python绽放了一场新春烟花盛宴&#xff0c;一起来看看吧&#xff01; 环境需求 python3.11.4及以上PyCharm Community Edition 2023.2.5pyinstaller6.2.0&#xff08;可选&#xff0c;这个库…

通过 editplus 批量转换文本编码

有时候需要对文本的编码进行批量转换&#xff0c;文本编辑器 notepad 中的“编码”菜单可以用来转换单个的文档编码&#xff0c;当文档数量多的时候&#xff0c;一个个操作比较繁琐&#xff0c;通过文本编辑器 editplus 软件&#xff0c;可以方便快速地批量修改文本文件的编码&…

微信网页授权之使用完整服务解决方案

目录 微信网页授权能力调整造成的问题 能力调整的内容和理由 原有运行方案 is_snapshotuser字段 改造原有方案 如何复现测试场景 小结 微信网页授权能力调整造成的问题 依附于第三方的开发&#xff0c;做为开发者经常会遇到第三方进行规范和开发的调整&#xff0c;如开…

基于SpringBoot+Vue的防汛应急物资管理系统

本防汛物资管理系统的主要分为管理员角色和用户角色&#xff0c;主要设计的功能包括注册登录管理、密码信息管理、用户信息管理、物资信息管理等模块。 注册登录管理&#xff1a;使用本系统需要打开浏览器&#xff0c;输入相应的网址&#xff0c;如果用户是首次使用本系统&…

下载、安装Jenkins

进入官网 下载Jenkins https://www.jenkins.io 直接点击Download 一般是下长期支持版 因为它是java写的&#xff0c;你要运行它&#xff08;Jenkins.war&#xff09;肯定要有java环境 有两种方式去运行它&#xff0c;一种是下载Tomcat&#xff08;是很经典的java容器或者jav…

Xcode 15 及以上版本:libarclite 库缺少问题

参考链接&#xff1a;Xcode 15 libarclite 缺失问题_sdk does not contain libarclite at the path /ap-CSDN博客 报错: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarcl…

MC插件服教程-paper+游戏云VPS

首先必须要先买一台VPS&#xff0c;这里以i9的机型做演示 购买完成等待大约1分钟服务器就会创建完成&#xff0c;之后在管理页可以看到服务器的连接信息 image772356 43 KB 首先复制下远程连接地址&#xff0c;此处即k.rainplay.cn:13192 之后在系统里搜索“rdp”或“远程桌面…

QT研究笔记(一)windows 开发环境安装部署

一、Qt 是什么&#xff1f; Qt 是一个跨平台的应用程序开发框架&#xff0c;最初由挪威的 Trolltech 公司开发&#xff0c;并于2008年被诺基亚收购。后来&#xff0c;Qt 框架由 Digia 公司接手&#xff0c;并在2012年成立了 The Qt Company。Qt 提供了一套丰富的工具和类库&am…

为什么越来越多的企业在考虑将ERP从云端迁移到本地?

越来越多的企业在考虑将核心ERP迁移到本地部署&#xff0c;原来实施的时候局限于业务规模、实施成本的原因采用云端部署的方式越来越不再适应于企业规模的发展、系统应用和数据安全的要求。 因此他们都宁愿将云端ERP的数据迁移到本地&#xff0c;使得系统数据和安全更加可控。…

接口测试框架对比

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 需求 1、接口编写…

python中[[]] * (n)和[[] for _ in range(n)]的区别

1、现象 刷leetcode207的时候碰到一个坑&#xff0c;用[[]] * (n)初始化二维数组&#xff0c;逻辑是正确的&#xff0c;但是结果始终不对。 2、原因 最后定位是初始化语句使用错误导致的&#xff0c;我使用的是[[]] * (n)&#xff0c;应该使用[[] for _ in range(n)] 3、解…

MagicVideo-V2:多阶段高保真视频生成框架

本项工作介绍了MagicVideo-V2&#xff0c;将文本到图像模型、视频运动生成器、参考图像embedding模块和帧内插模块集成到端到端的视频生成流程中。由于这些架构设计的好处&#xff0c;MagicVideo-V2能够生成具有极高保真度和流畅度的美观高分辨率视频。通过大规模用户评估&…

Android学习之路(28) 进程保活组件的封装

前言 远古时代&#xff0c;出现过很多黑科技&#xff0c;比如MarsDaemon&#xff0c;使用双进程守护的方式进行保活&#xff0c;在当时可谓风光无限&#xff0c;可惜在8.0时代到来就被废弃了。 又比如后面出现的1像素Activity的保活方式&#xff0c;说他流氓一点不过分&#…

Linux 驱动开发基础知识——内核对设备树的处理与使用(十)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

344. Reverse String(反转字符串)

题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 问题分析 以中间字符为轴&#xff0c;将两边的字符对换…

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

day35 柠檬水找零 根据身高重建队列 用最少数量的箭引爆气球

题目1&#xff1a;860 柠檬水找零 题目链接&#xff1a;860 柠檬水找零 题意 一杯柠檬水5美元&#xff0c;每位顾客只买一杯柠檬水&#xff0c;支付5美玉&#xff0c;10美元&#xff0c;20美元&#xff0c;必须正确找零 开始时并没有零钱 若可以正确找零&#xff0c;则返回…

操作系统透视:从历史沿革到现代应用,剖析Linux与网站服务架构

目录 操作系统 windows macos Linux 服务器搭建网站 关于解释器的流程 curl -I命令 名词解释 dos bash/terminal&#xff0c;(终端) nginx/apache&#xff08;Linux平台下的&#xff09; iis&#xff08;Windows平台下的&#xff09; GUI(图形化管理接口&#xff…

python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…