京东到家首页开发

1.项目初始化

创建项目时需要注意下面选项


2.项目具体介绍

用VSCode打开项目后,下载 ESLint 和 Vetur 插件
(1)ESlint:在编码时可以给我吗一些语法上的提示
(2)Vetur:帮助我们识别vue中的语法,让vue中的单文件组件能高亮地显示出来
(3)node_modules:存放vue中的依赖包,第三方的模块
若是不小心删除了,想要重新获取,可在终端使用npm install命令,npm install 会安装package.jason中的依赖,在安装依赖的时候会将这些依赖放入到node_modules中
(4)public目录:存放默认的html模板
(5)README.md:项目的一些描述性内容
(6)package-lock.jason:保证多人协作,反复安装依赖时一个固定的版本
(7)src最重要,源代码目录,main.js程序入口

3.基础样式集成和开发模拟器的使用

1.在终端输入

npm install normalize.css --save

:统一不同浏览器之间的样式差异
2.在main.js文件中引入normalize

import 'normalize.css'

3.在src文件夹下创建一个名为style的文件夹
在文件夹style下创建一个文件,命名为base.css,内容编写如下

html{
    font-size: 100px;
}
// 1rem = html fontsize = 100px
body{
    font-size: .12rem;
}

在main.js文件中引入base.css

import './style/base.css'

main.js代码如下

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import 'normalize.css'
import './style/base.css'
createApp(App).use(store).use(router).mount('#app')

首页开发

1.底部Docer开发

(1)在components文件下创建DockerV.vue,表示新建一个组件
其中需要的小图标可以去iconfont官网找到,在style文件夹下创建一个iconfont.css文件,将从iconfont官网获取的文件中粘贴代码

*若是iconfont项目图标库有更新使用,这里的代码也要记得更新

iconfont.css

@font-face {
  font-family: 'iconfont';  /* Project id 3220603 */
  src: url('//at.alicdn.com/t/font_3220603_9vci4ti956.woff2?t=1648890516449') format('woff2'),
       url('//at.alicdn.com/t/font_3220603_9vci4ti956.woff?t=1648890516449') format('woff'),
       url('//at.alicdn.com/t/font_3220603_9vci4ti956.ttf?t=1648890516449') format('truetype');
}
  
  .iconfont {
    font-family: "iconfont" !important;
    font-size: .16rem;
    font-style: normal;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
  }

然后在main.js中可引入iconfont.css文件
DockerV.vue代码

<template>
 <div class="docker">
    <!--BEM block element Modifier
    block__element--Modifier -->
    <div 
    v-for="(item,index) in dockerList"
    :class="{'docker__item':true,'docker__item--active':index===currentIndex}"
    class="docker__item "
    :key="item.icon"
    >
      <router-link :to="item.to">
        <div class="iconfont" v-html="item.icon" />
        <div class="docker__title">{{item.text}}</div>
      </router-link>
      
    </div>
</div>
</template>
<script>
export default {
    name:'DockerV',
    props:['currentIndex'],
    setup(){
      const dockerList = [
        {icon:'&#xe867;',text:'首页',to:{name:'Home'}},
        {icon:'&#xe6bc;',text:'购物车',to:{name:'CartList'}},
        {icon:'&#xe7b3',text:'订单',to:{name:'OrderList'}},
        {icon:'&#xe78b',text:'我的',to:{name:'Home'}}
      ];
      return {dockerList}
    }
}
</script>
<style lang="scss" scoped>
@import '../style/viriables.scss';
@import '../style/mixins.scss';
.docker{
  display: flex;
  box-sizing: border-box;
  position: absolute;
  padding: 0 .18rem;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 0.49rem;
  border-top:.01rem solid $content-bgcolor ;
  
  &__item{
    flex: 1;
    text-align: center;
    a{
      color: $content-fontcolor;
      text-decoration: none;
    }
    .iconfont{
      margin: .07rem 0 .02rem 0;
      font-size: .18rem;
    }
    &--active{
      a{
        color: #1FA4FC;
      }
    }
  }
  &__title{
    font-size: .2rem;
    transform: scale(0.5, 0.5);
    transform-origin: center top;
  }
}
</style>

(2)其中,基础的css文件可以单独创建一个文件
在style文件夹下面创建一个index.css文件
index.css

@import './base.scss';
@import './iconfont.css';

然后将index.css引入main.js

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import 'normalize.css'
import './style/index.scss'
createApp(App).use(store).use(router).mount('#app')

(2)可使用v-for,v-html指令来精简代码减少冗余

2.首页部分代码如下

(1)HomeV.vue,
注意在使用其他组件时要记得引入和注册组件

<script>
import StaticPart from './StaticPart.vue';
import NearbyV from './NearbyV.vue';
import DockerV from '../../components/DockerV.vue';
export default {
   name:'HomeV',
   components:{StaticPart,NearbyV, DockerV}
}
</script>

首页整体代码

<template>
  <div class="wrapper">
    <StaticPart />
    <NearbyV />
  </div>
  <DockerV :currentIndex='0' /> 
</template>
<script>
import StaticPart from './StaticPart.vue';
import NearbyV from './NearbyV.vue';
import DockerV from '../../components/DockerV.vue';
export default {
   name:'HomeV',
   components:{StaticPart,NearbyV, DockerV}
}
</script>
<style lang="scss">
.wrapper{
  overflow-y: auto;
  position: absolute;
  left: 0;
  top: 0;
  bottom: .5rem;
  right: 0;
  padding: 0 .18rem .3rem .18rem;

}
</style>

(2)NearbyV.vue 附近部分代码

<template>
    <div class="nearby">
      <h3 class="nearby__title">附近店铺</h3>
      <router-link
        v-for="item in nearbyList"
        :key="item._id"
        :to="`/shop/${item._id}`"
      >
        <ShopInfo :item="item" />
      </router-link>
      
    </div>
</template>

<script>
import {ref} from 'vue';
import { get } from '../../utils/request';
import ShopInfo from '../../components/ShopInfo.vue'

const useNearbyEffect = ()=>{
  const nearbyList = ref([]);
  const getNearbyList = async ()=>{
    const result = await get('/api/shop/hot-list');
    if(result?.errno === 0 && result?.data?.length){
      nearbyList.value = result.data;
    }
  }
  return {nearbyList,getNearbyList}
}
export default {
   name:'NearbyV',
   components:{ ShopInfo },
   setup(){
     const {nearbyList,getNearbyList} = useNearbyEffect();
      getNearbyList();
      return { nearbyList }
   },
}
</script>

<style lang='scss'>
@import '../../style/viriables.scss';
@import '../../style/mixins.scss';
.nearby{
  &__title{
    margin: .16rem 0 .02rem;
    font-size: .18rem;
    font-weight: normal;
    color: $content-fontcolor;
  }
  a{
    text-decoration: none;
  }
}
</style>

(3)StaticPart.vue中间详情部分代码

<template>
    <div class="position">
      <span class="iconfont position__icon">&#xe7f1;</span>
      南华大学雨母校区三省园5栋
      <span class="iconfont position__notice">&#xe60b;</span>
    </div>
    <div class="serch">
      <span class="iconfont">&#xe615;</span>
      <span class="serch__text">屈臣氏部分美妆六折起</span>
    </div>
    <div class="banner">
      <img 
      class="banner__img" 
      src="http://www.dell-lee.com/imgs/vue3/banner.jpg" 
      />
    </div>
    <div class="icons">
      <div
        v-for="item in iconList"
        class="icons__item"
        :key="item.desc"
      >
        <img 
        class="icons__item__img" 
        :src="`http://www.dell-lee.com/imgs/vue3/${item.imgName}.png`"
        />
        <p class="icons__item__desc">{{item.desc}}</p>
      </div>  
    </div>
    <div class="gap"></div>
</template>

<script>
export default {
   name:'StaticPart',
   setup(){
     const iconList = [
       { imgName:'超市',desc:'超市便利' },
       { imgName:'菜市场',desc:'菜市场' },
       { imgName:'水果店',desc:'水果店' },
       { imgName:'鲜花',desc:'鲜花绿植' },
       { imgName:'医药健康',desc:'医药健康' },
       { imgName:'家居',desc:'家居时尚' },
       { imgName:'蛋糕',desc:'烘培蛋糕' },
       { imgName:'签到',desc:'签到' },
       { imgName:'大牌免运',desc:'大牌免运' },
       { imgName:'红包',desc:'红包套餐' },
     ];
     return {iconList}
   }
}
</script>

<style lang="scss">
@import '../../style/viriables.scss';
@import '../../style/mixins.scss';
.position{
    position: relative;
    padding: .16rem .24rem .16rem 0 ;
    line-height: .22rem;
    font-size: .16rem;
    @include ellipsis;
    .position__icon{
      position: relative;
      top: .01rem;
      font-size: .2rem;
    }
    .position__notice{
      position: absolute;
      right: 0;
      top: .17rem;
      font-size: .2rem;
    }
    color: $content-fontcolor;
}
.serch{
  margin-bottom: .12rem;
  vertical-align: middle;
  line-height: .32rem;
  background: $search-bgColor;
  color: $search-fontColor;
  border-radius:.16rem ;
  .iconfont{
    display: inline-block;
    padding: 0 .08rem 0 .16rem;
    font-size: .16rem;

  }
  &__text{
    display: inline-block;
    font-size: .14rem;
  }
}
.banner{
  height: 0;
  overflow: hidden;
  padding-bottom: 25.4%;
  &__img{
    width: 100%;
  }
}
.icons{
  display: flex;
  flex-wrap: wrap;
  margin-top: .16rem;
  &__item{
    width: 20%;
    &__img{
      display: block;
      width: .4rem;
      height: .4rem;
      margin: 0 auto;
    }
    &__desc{
      margin: .16rem 0 .16rem 0;
      text-align: center;
      color: $content-fontcolor;
    }
  }
}
.gap{
  margin: 0 -.18rem;
  height: .1rem;
  background: $content-bgcolor;
}
</style>

(4)Docker.vue见上面
css作用域约束,一个组件内的样式只作用与这一个组件,不会影响到外部的组件

<style lang="scss" scoped>

首页实现界面

首页.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容