本代码用于构建一个基于 Vue3 的卡片式食谱展示应用,该应用允许用户浏览各种食谱,并查看其详细内容和营养信息。它适用于美食博客、食谱网站或任何希望展示食谱集合的场景。
此代码实现了以下基本功能:
1. 页面布局
页面布局使用 Flexbox 布局,分为头部、导航栏和主内容区域。头部包含搜索栏和选项按钮,导航栏包含食谱类别选项卡,主内容区域用于展示食谱卡片。
<template>
<div class="flex flex-col h-screen bg-gray-100">
<div class="flex items-center justify-between p-4 border-b border-gray-200">
<!-- 头部 -->
<van-icon name="arrow-left" size="24" color="#333" />
<input type="text" placeholder="Search..." class="w-full h-10 px-4 text-sm bg-gray-200 rounded-full focus:outline-none" />
<van-icon name="option" size="24" color="#333" />
</div>
<div class="flex items-center justify-between px-4 py-2 border-b border-gray-200">
<!-- 导航栏 -->
<van-button round type="primary" size="small">View all</van-button>
<van-tabs v-model="activeTab" class="flex items-center">
<van-tab>Dinner</van-tab>
<van-tab>Vegetables</van-tab>
<van-tab>Breakfast</van-tab>
<van-tab>Brunch</van-tab>
<van-tab>Chinese</van-tab>
</van-tabs>
</div>
<div class="flex flex-col flex-1 overflow-y-auto p-4">
<!-- 主内容区域 -->
<van-card shadow :bordered="false" class="mb-4">
<!-- 食谱卡片 -->
</van-card>
</div>
</div>
</template>
2. 食谱卡片
食谱卡片使用 Vue3 的 v-for
指令来遍历食谱数据并生成卡片。每个卡片包含以下内容:
<van-card shadow :bordered="false" class="mb-4">
<template #title>
<div class="flex items-center justify-between">
<div class="flex items-center">
<img src="https://source.unsplash.com/random/100x100" alt="" class="w-10 h-10 rounded-full mr-2" />
<div class="text-sm font-semibold">Hummus with pomegranate and nuts</div>
</div>
<div class="flex items-center">
<van-icon name="heart" size="20" color="#ff5722" />
</div>
</div>
</template>
<div class="flex items-center justify-between mt-2">
<div class="flex items-center">
<van-icon name="time-o" size="16" color="#999" />
<span class="text-sm text-gray-500 ml-1">15 min</span>
</div>
<div class="flex items-center">
<van-icon name="fire" size="16" color="#999" />
<span class="text-sm text-gray-500 ml-1">346 kcal</span>
</div>
</div>
</van-card>
3. 食谱详情页
点击食谱卡片后,会进入食谱详情页。该页面包含以下内容:
<div class="flex flex-col p-6">
<div class="flex items-center justify-between">
<h1 class="text-2xl font-bold">{{ recipe.title }}</h1>
<van-icon name="heart" size="24" color="#ff5722" />
</div>
<div class="flex items-center justify-between mt-4">
<div class="flex items-center">
<van-icon name="time-o" size="16" color="#999" />
<span class="text-sm text-gray-500 ml-1">{{ recipe.time }}</span>
</div>
<div class="flex items-center">
<van-icon name="fire" size="16" color="#999" />
<span class="text-sm text-gray-500 ml-1">{{ recipe.calories }} kcal</span>
</div>
</div>
<div class="mt-4">
<h2 class="text-xl font-semibold">Ingredients</h2>
<ul class="list-disc ml-6">
<li v-for="ingredient in recipe.ingredients" :key="ingredient">{{ ingredient }}</li>
</ul>
</div>
<div class="mt-4">
<h2 class="text-xl font-semibold">Steps</h2>
<ol class="list-decimal ml-6">
<li v-for="step in recipe.steps" :key="step">{{ step }}</li>
</ol>
</div>
</div>
4. 食谱过滤
用户可以通过导航栏中的选项卡过滤食谱。当点击选项卡时,activeTab
响应式变量将更新,并触发过滤功能。
<script setup>
import { ref } from 'vue'
const activeTab = ref('Dinner')
const recipes = [
// ...
]
onMounted(() => {
// Do something after the page is mounted
})
</script>
开发过程中的经验与收获:
未来该卡片功能的拓展与优化: