乐意购项目前端开发 #4

这篇具有很好参考价值的文章主要介绍了乐意购项目前端开发 #4。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Home页面组件结构

结构拆分

 创建组件

在 views/Home 目录下创建component 目录, 然后在该目录下创建5个组件: 左侧分类(HomeCategory.vue)、Banner(HomeBanner.vue)、精选商品(HomeHot.vue)、低价商品(Homecheap.vue)、最新上架(HomeNew.vue)乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

引用组件

修改 views/Home/index.vue 的代码

<template>
  <div class="container">
    <HomeCategory></HomeCategory>
    <HomeBanner></HomeBanner>
  </div>
  <HomeHot></HomeHot>
  <HomeCheap></HomeCheap>
  <HomeNew></HomeNew>
</template>

<script>
import HomeBanner from './component/HomeBanner.vue'
import HomeCategory from './component/HomeCategory.vue'
import HomeHot from './component/HomeHot.vue'
import HomeNew from './component/HomeNew.vue'
import HomeCheap from './component/HomeCheap'
export default {
  components:{
    HomeBanner,
    HomeCategory,
    HomeHot,
    HomeNew,
    HomeCheap
  }

}
</script>

<style>

</style>

二、安装Pinia

添加依赖

pinia依赖和持久化插件

npm install pinia
npm install pinia-plugin-persist

创建文件

在 stores 目录下创建 category.js 文件

import { ref } from 'vue'
import { defineStore } from 'pinia'

引入

修改 main.js 文件

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import { createPinia } from 'pinia' 
import piniaPersist from 'pinia-plugin-persist'
import ElementPlus from 'element-plus'
import "@/assets/iconfont/iconfont.js"
import "@/assets/iconfont/iconfont.css"

// import './styles/element/index.scss'

const pinia = createPinia()
pinia.use(piniaPersist)
const app = createApp(App)

app.use(store).use(router).use(pinia).use(ElementPlus).mount('#app')

三、分类功能实现

乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

封装接口

在 api 目录下创建 home 目录然后创建 category.js 文件乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

import http from '@/utils/http'

export function getCategoryAPI () {
  return http({
    url: '/home/category/list',
    method: 'get',
  })
}

前提: 后端要返回相应的数据

修改 /store/category.js

import { ref } from 'vue'
import { defineStore } from 'pinia'
import { getCategoryAPI } from '@/api/home/category'

export const useCategoryStore = defineStore('category', () => {
    // 导航列表数据管理
    //state 导航列表数据
    const categoryList = ref([])

    // action 获取导航数据的方法
    const getCategory = async () => {
        const res = await getCategoryAPI();
        console.log(res);
        categoryList.value = res.data;
    }

    return {
        categoryList, getCategory
    }
})

代码示范

HomeCategory.vue

<script setup>
import { useCategoryStore } from '@/store/category'
const categoryStore = useCategoryStore()
console.log(categoryStore);
</script>

<template>
  <div class="home-category">
    <ul class="menu">
      <li v-for="item in categoryStore.categoryList" :key="item.id">
        <i :class=item.icon></i>
        <router-link to="/">{{ item.categoryName }}</router-link>
        <span class="more">
          <a href="/">></a>
        </span>
        <!-- 弹层layer位置 -->
        <!-- <div class="layer">
          <h4>分类推荐 <small>根据您的购买或浏览记录推荐</small></h4>
          <ul>
            <li v-for="i in 5" :key="i">
              <RouterLink to="/">
                <img alt="" />
                <div class="info">
                  <p class="name ellipsis-2">
                    男士外套
                  </p>
                  <p class="desc ellipsis">男士外套,冬季必选</p>
                  <p class="price"><i>¥</i>200.00</p>
                </div>
              </RouterLink>
            </li>
          </ul>
        </div> -->
      </li>
    </ul>
  </div>
</template>


<style scoped lang='scss'>
.home-category {
  width: 250px;
  height: 500px;
  background: #f2f2f2;
  position: relative;
  z-index: 99;

  .menu {
    li {
      padding-left: 40px;
      height: 55px;
      line-height: 55px;
      text-align: left;
      padding-right: 15px;

      border-bottom: solid .1px #000;
      .iconfont{
        font-size: 22px;
        line-height: 55px;
        margin-right: 10px;
        top: 5px;
        color: rgb(0, 110, 255);
      }
      &:hover {
        background: $lygColor;
      }

      a {
        position: absolute;
        margin-right: 4px;
        color: #000;

        &:first-child {
          font-size: 16px;
        }
      }
      .more{
        float: right;
        font-size: 18px;
      }

      .layer {
        width: 990px;
        height: 500px;
        background: rgba(255, 255, 255, 0.8);
        position: absolute;
        left: 250px;
        top: 0;
        display: none;
        padding: 0 15px;

        h4 {
          font-size: 20px;
          font-weight: normal;
          line-height: 80px;

          small {
            font-size: 16px;
            color: #666;
          }
        }

        ul {
          display: flex;
          flex-wrap: wrap;

          li {
            width: 310px;
            height: 120px;
            margin-right: 15px;
            margin-bottom: 15px;
            border: 1px solid #eee;
            border-radius: 4px;
            background: #fff;

            &:nth-child(3n) {
              margin-right: 0;
            }

            a {
              display: flex;
              width: 100%;
              height: 100%;
              align-items: center;
              padding: 10px;

              &:hover {
                background: #e3f9f4;
              }

              img {
                width: 95px;
                height: 95px;
              }

              .info {
                padding-left: 10px;
                line-height: 24px;
                overflow: hidden;

                .name {
                  font-size: 16px;
                  color: #666;
                }

                .desc {
                  color: #999;
                }

                .price {
                  font-size: 22px;
                  color: $priceColor;

                  i {
                    font-size: 16px;
                  }
                }
              }
            }
          }
        }
      }

      // 关键样式  hover状态下的layer盒子变成block
      &:hover {
        .layer {
          display: block;
        }
      }
    }
  }
}
</style>

四、banner功能实现

乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

接口封装

 在 api 目录下创建 home 目录然后创建 banner.js 文件乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

import http from '@/utils/http'

export function getBannerAPI () {
  return http({
    url: '/home/banner/list',
    method: 'get',
  })
}

代码示范

HomeBanner.vue

<script setup>
import { getBannerAPI } from '@/api/home/banner'
import { onMounted, ref } from 'vue'

const bannerList = ref([])

const getBanner = async () => {
  const res = await getBannerAPI()
  console.log(res)
  bannerList.value = res.data
}

onMounted(() => getBanner());
console.log(bannerList)
</script>

<template>
  <div class="home-banner">
    <el-carousel height="500px">
      <el-carousel-item v-for="item in bannerList" :key="item.id">
        <img :src="require(`@/assets/img/${item.img1}.jpg`)" alt="">
      </el-carousel-item>
    </el-carousel>
  </div>
</template>




<style scoped lang='scss'>
.home-banner {
  width: 1127px;
  height: 500px;
  position: absolute;
  left: 250px;
  top: 185px;
  z-index: 98;

  img {
    width: 100%;
    height: 500px;
  }
}
</style>

五、创建公共组件

创建文件

在 views/Home/components 路径下创建 HomePanel.vue 文件

乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

<script setup>
//定义 Props,主标题和副标题
defineProps({
    title: {
        type: String
    },
    subTitle: {
        type: String
    }
})
</script>


<template>
  <div class="home-panel">
    <div class="container">
  <div class="head">
    <!-- 主标题和副标题 -->
    <h3>
      {{title}}<small>{{ subTitle }}</small>
    </h3>
  </div>
  <!-- 主体内容区域 插槽-->
  <slot/>
</div>

  </div>
</template>

<style scoped lang='scss'>
.home-panel {
  background-color: #fff;

  .head {
    padding: 40px 0;
    display: flex;
    align-items: flex-end;

    h3 {
      flex: 1;
      font-size: 32px;
      font-weight: normal;
      margin-left: 6px;
      height: 35px;
      line-height: 35px;

      small {
        font-size: 16px;
        color: #999;
        margin-left: 20px;
      }
    }
  }
}
</style>

六、精选商品实现

乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

 接口封装

 在 api 目录下创建 home 目录然后创建 hot.js 文件乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

代码示范

HomeHot.vue

<script setup>
import HomePanel from './HomePanel.vue';
import { ref, onMounted } from 'vue'
import { getHotAPI } from '@/api/home/hot'

const hotList = ref([])
const getHotList = async() => {
    const res = await getHotAPI()
    console.log(res)
    hotList.value = res.data
}

onMounted(() => {
    getHotList()
})
</script>

<template>
    <HomePanel title="精选商品" sub-title="人气精选 不容错过">
        <!-- 下面是插槽主体内容模版 -->
        <ul class="goods-list">
            <li v-for="item in hotList" :key="item.id">
                <RouterLink to="/">
                    <img :src="require(`@/assets/img/${item.picture1}.jpg`)" :alt="item.alt" />
                    <p class="name">{{ item.goodsName }}</p>
                    <p class="price">&yen;{{ item.price }}</p>
                </RouterLink>
            </li>
        </ul>
    </HomePanel>
</template>


<style scoped lang='scss'>
.goods-list {
  display: flex;
  justify-content: space-between;
  height: 406px;
  width: 100%;

  li {
    width: 306px;
    height: 406px;

    background: #f0f9f4;
    transition: all .5s;

    &:hover {
      transform: translate3d(0, -3px, 0);
      box-shadow: 0 3px 8px rgb(0 0 0 / 20%);
    }

    img {
      width: 306px;
      height: 306px;
    }

    p {
      font-size: 22px;
      padding-top: 12px;
      text-align: center;
      text-overflow: ellipsis;
      overflow: hidden;
      white-space: nowrap;
      color: #000;
    }

    .price {
      color: $priceColor;
    }
  }
}
</style>

七、低价好物

乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

 接口封装

 在 api 目录下创建 home 目录然后创建 cheap.js 文件乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

代码示范

HomeCheap.vue

<script setup>
import HomePanel from './HomePanel.vue';
import { ref, onMounted } from 'vue'
import { getCheapAPI } from '@/api/home/cheap'

const cheapList = ref([])
const getCheapList = async() => {
    const res = await getCheapAPI()
    console.log(res)
    cheapList.value = res.data
}

onMounted(() => {
    getCheapList()
})
</script>

<template>
    <HomePanel title="低价好物" sub-title="价低质不低 不容错过">
        <!-- 下面是插槽主体内容模版 -->
        <ul class="goods-list">
            <li v-for="item in cheapList" :key="item.id">
                <RouterLink to="/">
                    <img :src="require(`@/assets/img/${item.picture1}.jpg`)" :alt="item.alt" />
                    <p class="name">{{ item.goodsName }}</p>
                    <p class="price">&yen;{{ item.price }}</p>
                </RouterLink>
            </li>
        </ul>
    </HomePanel>
</template>


<style scoped lang='scss'>
.goods-list {
  display: flex;
  justify-content: space-between;
  height: 406px;
  width: 100%;

  li {
    width: 306px;
    height: 406px;

    background: #f0f9f4;
    transition: all .5s;

    &:hover {
      transform: translate3d(0, -3px, 0);
      box-shadow: 0 3px 8px rgb(0 0 0 / 20%);
    }

    img {
      width: 306px;
      height: 306px;
    }

    p {
      font-size: 22px;
      padding-top: 12px;
      text-align: center;
      text-overflow: ellipsis;
      overflow: hidden;
      white-space: nowrap;
      color: #000;
    }

    .price {
      color: $priceColor;
    }
  }
}
</style>

八、最新上架

乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

 接口封装

 在 api 目录下创建 home 目录然后创建 new.js 文件乐意购项目前端开发 #4,JS,HTML,javascript,前端,开发语言

代码示范

HomeNew.vue文章来源地址https://www.toymoban.com/news/detail-800192.html

<script setup>
import HomePanel from './HomePanel.vue';
import { ref, onMounted } from 'vue'
import { getNewAPI } from '@/api/home/new'

const newList = ref([])
const getNewList = async() => {
    const res = await getNewAPI()
    console.log(res)
    newList.value = res.data
}

onMounted(() => {
    getNewList()
})
</script>

<template>
    <HomePanel title="最新上架" sub-title="新鲜出炉 品质保障">
        <!-- 下面是插槽主体内容模版 -->
        <ul class="goods-list">
            <li v-for="item in newList" :key="item.id">
                <RouterLink to="/">
                    <img :src="require(`@/assets/img/${item.picture1}.jpg`)" :alt="item.alt" />
                    <p class="name">{{ item.goodsName }}</p>
                    <p class="price">&yen;{{ item.price }}</p>
                </RouterLink>
            </li>
        </ul>
    </HomePanel>
</template>


<style scoped lang='scss'>
.goods-list {
  display: flex;
  justify-content: space-between;
  height: 406px;
  width: 100%;

  li {
    width: 306px;
    height: 406px;

    background: #f0f9f4;
    transition: all .5s;

    &:hover {
      transform: translate3d(0, -3px, 0);
      box-shadow: 0 3px 8px rgb(0 0 0 / 20%);
    }

    img {
      width: 306px;
      height: 306px;
    }

    p {
      font-size: 22px;
      padding-top: 12px;
      text-align: center;
      text-overflow: ellipsis;
      overflow: hidden;
      white-space: nowrap;
      color: #000;
    }

    .price {
      color: $priceColor;
    }
  }
}
</style>

到了这里,关于乐意购项目前端开发 #4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端练手小项目--自定义时间(html+css+js)

    关于要写这篇文章的原因 是记录在工作上遇到的困难需求, 是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性,难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。 取消勾选框开始时间与结束时间清空。 选择开始时间,勾选框勾选,结

    2024年02月12日
    浏览(33)
  • 5个前端练手项目(html css js canvas)

     前言: 首先祝大家端午节快乐。本篇文章有5个练手项目 对于刚学完前端三剑客的你们。应该是一个很好的实践 目录 🥩.跑马灯 1.1效果图: 1.2思路解析 1.3源码 🍧.彩虹爱心 2.1效果图 2.2思路解析 2.3源码 🌮.闹钟 3.1效果图 3.2思路解析 3.3源码 🍲.自制笔记本 4.1效果展示 4

    2024年02月02日
    浏览(43)
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 网页标题:三列自适应宽度 网页标题:多行三列自适应宽度 一级水平导航菜单:采用“无序列表+超

    2024年01月16日
    浏览(59)
  • [HTML]Web前端开发技术9(HTML5、CSS3、JavaScript )——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 CSS颜色与背景 颜色color属性 背景background属性 1. 背景颜色background-color 2. 背景图像background-image 3. 背景

    2024年02月03日
    浏览(61)
  • 【前端】夯实基础 css/html/js 50个练手项目(持续更新)

    发现一个没有用前端框架的练手项目,很适合我这种纯后端开发夯实基础,内含50个mini project,学习一下,做做笔记。 项目地址:https://github.com/bradtraversy/50projects50days 效果预览 核心代码: 知识点总结: 响应式布局 flex: 5; 操作 classList 可以动态修改节点的 class 效果预览 核心

    2024年02月22日
    浏览(32)
  • python_web1(前端开发之HTML、CSS、Bootstap、Javascript、JQuery)

    知识总结: Python_web前端开发 python 安装Flask web框架 pip install flask 简介:templates用来返回html的页面,而非文本。 创建文件index.html 结构如下 index.xml内容如下: web1.py内容如下: 重新运行后: 固定格式:h/div/span/a/img/ul/li/table/input/form 通用的字符编码 meta charset=“UTF-8” div:一个

    2024年04月14日
    浏览(51)
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 CSS的定位机制 文档流定位 元素类型   浮动定位 float的用处 float的特点 clear属性 层定位 position属性

    2024年02月05日
    浏览(53)
  • Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript

    家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有运用,CSS的代码量也很足、很细致,使用hover来完成

    2024年02月08日
    浏览(47)
  • Web前端开发技术课程大作业: 关于美食的HTML网页设计——HTML+CSS+JavaScript在线美食订餐网站html模板源码30个页面:

    👨‍🎓静态网站的编写主要是用HTML DIV+CSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的前端Html5代码都是一致的,本网页适合修改成为各种类型的产品展示网页,比

    2024年02月12日
    浏览(60)
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 CSS盒模型简介 CSS盒模型 CSS盒模型结构 盒模型的属性 边框border 边框宽度border-width 边框样式border-sty

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包