【vue3.0】19.0 某东到家(十九)——订单页面创建及顶部布局

修改 src\views\home\Docker.vue

<template>
  <!-- 底部主菜单容器 -->
  <div class="docker">
    <span
      :class="{ docker__item: true, 'docker__item--active': item.active }"
      v-for="(item, index) in dockerList"
      :key="index"
    >
      <router-link :to="item.to">
        <div class="docker__item_icon">
          <i :class="item.icon"></i>
        </div>
        <div class="docker__item__title">{{ item.title }}</div>
      </router-link>
    </span>
  </div>
</template>

<script>
export default {
  name: 'Docker',
  setup() {
    const dockerList = [
      {
        active: true,
        icon: 'custom-icon custom-icon-home',
        title: '首页',
        to: '/'
      },
      {
        icon: 'custom-icon custom-icon-shopping',
        title: '购物车',
        to: '/cartList'
      },
      {
        icon: 'custom-icon custom-icon-order',
        title: '订单',
        to: '/'
      },
      {
        icon: 'custom-icon custom-icon-my',
        title: '我的',
        to: '/'
      }
    ]

    return { dockerList }
  }
}
</script>

<style lang="scss" scoped>
@import '@/style/viriables';
@import '@/style/mixins';
.docker {
  color: $content-font-color;
  display: flex; //自适应均赠,弹性盒子
  position: absolute; //绝对定位
  box-sizing: border-box; //这个会以body的最外层作为容器的最外层
  padding: 0 0.18rem;
  left: 0;
  bottom: 0;
  width: 100%;
  height: 0.49rem;
  border-top: 1px solid $content-bg-color;
  &__item {
    flex: 1;
    text-align: center;
    a {
      color: $content-font-color;
      text-decoration: none;
    }
    &--active {
      a {
        color: #1fa4fc;
      }
    }
    &_icon {
      margin: 0.05rem 0 0.02rem 0; //图标距离上边距7px左右;
      font-size: 0.18rem;
    }
    &__title {
      //浏览器最小像素是12px,如果想表达12px以下大小得如下编写
      font-size: 0.12rem;
      transform: scale(0.5 0.5); //横向缩小50% 纵向搜小50%
      transform-origin: center top; //缩放的中心点
    }
  }
}
</style>

主要是构建路由跳转。
增加代码如下:

      <router-link :to="item.to">
......
      </router-link>

......
    const dockerList = [
      {
        active: true,
        icon: 'custom-icon custom-icon-home',
        title: '首页',
        to: '/'
      },
      {
        icon: 'custom-icon custom-icon-shopping',
        title: '购物车',
        to: '/cartList'
      },
      {
        icon: 'custom-icon custom-icon-order',
        title: '订单',
        to: '/'
      },
      {
        icon: 'custom-icon custom-icon-my',
        title: '我的',
        to: '/'
      }
    ]
......

新增页面src\views\cartList\CartList.vue

<template> cartList</template>

<script>
export default {
  name: 'CartList'
}
</script>

新增路由:
src\router\index.js

  {
    path: '/cartList',
    name: 'CartList',
    component: () =>
      import(
        /* webpackChunkName: "cartList" */ '../views/cartList/CartList.vue'
      )
  },
新增订单页面

调整路由:

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
 ......
  {
    path: '/orderConfirmation',
    name: 'OrderConfirmation',
    component: () =>
      import(
        /* webpackChunkName: "orderConfirmation" */ '../views/OrderConfirmation/OrderConfirmation.vue'
      )
  }
]
......
export default router

创建src\views\orderConfirmation\OrderConfirmation.vue:

<template> </template>
<script>
export default {
  name: 'OrderConfirmation',
  setup() {}
}
</script>

路由文件更新如下:
src\router\index.js

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () =>
      import(/* webpackChunkName: "home" */ '../views/home/Home.vue')
  },
  {
    path: '/login',
    name: 'Login',
    component: () =>
      import(/* webpackChunkName: "login" */ '../views/login/Login.vue'),
    beforeEnter: (to, from, next) => {
      // 只有访问Login页面之前才会执行次函数
      const { isLogin } = localStorage // 从本地存储中取isLogin
      // 如果登录,就跳到首页页面;否则跳转到登录页面
      isLogin ? next({ name: 'Home' }) : next()
    }
  },
  {
    path: '/register',
    name: 'Register',
    component: () =>
      import(
        /* webpackChunkName: "register" */ '../views/register/Register.vue'
      ),
    beforeEnter: (to, from, next) => {
      const { isLogin } = localStorage
      isLogin ? next({ name: 'Home' }) : next()
    }
  },
  {
    path: '/shop/:id',
    name: 'Shop',
    component: () =>
      import(/* webpackChunkName: "shop" */ '../views/shop/Shop.vue')
  },
  {
    path: '/cartList',
    name: 'CartList',
    component: () =>
      import(
        /* webpackChunkName: "cartList" */ '../views/cartList/CartList.vue'
      )
  },
  {
    path: '/orderConfirmation',
    name: 'OrderConfirmation',
    component: () =>
      import(
        /* webpackChunkName: "orderConfirmation" */ '../views/orderConfirmation/OrderConfirmation.vue'
      )
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})
// beforeEach:全局,每次做路由跳转之前都会执行这个操作。
router.beforeEach((to, from, next) => {
  // to and from are Route Object,
  // to:跳转的时候想要跳转的页面的信息
  // from :指从哪里跳过来的信息
  // next() must be called to resolve the hook}
  // 中间件继续执行的方法

  // 从本地存储中取isLogin
  const { isLogin } = localStorage

  console.log(to, from)
  /** 判断是否登录 */
  // 必须双循环,才能防止死循环
  // 如果没有登录,就跳到登录页面
  const { name } = to
  const isLoginOrRegister = name === 'Login' || name === 'Register'
  isLogin || isLoginOrRegister ? next() : next({ name: 'Login' })
})
export default router

新建文件
src\views\orderConfirmation\OrderConfirmation.vue

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

<script>
// import { ref } from 'vue'
export default {
  name: 'OrderConfirmation'
}
</script>

修改src\views\shop\Cart.vue

......
     <div class="check__btn">
        <router-link :to="{ name: 'OrderConfirmation' }">
          去结算
        </router-link>
      </div>
......

跳转后需要知道是哪个商铺下的购物车订单。这时候需要带一个参数过去,可以修改如下:

src\views\orderConfirmation\OrderConfirmation.vue                 
......
      <div class="check__btn">
        <router-link :to="{ path: `/orderConfirmation/${shopId}` }">
          去结算
        </router-link>
      </div>
......
image.png

修改路由:
src\router\index.js

  {
    path: '/orderConfirmation/:shopId',
    name: 'OrderConfirmation',
    component: () =>
      import(
        /* webpackChunkName: "orderConfirmation" */ '../views/orderConfirmation/OrderConfirmation.vue'
      )
  }
订单页面样式布局

首先完善一下骨架:
src\views\orderConfirmation\OrderConfirmation.vue

<template>
  <div class="top">
    <div class="top__bgcolor" />
    <div class="top__header">
      <span><i class="custom-icon custom-icon-back"></i> 确认订单</span>
    </div>
    <div class="top__receiver">
      <div class="top__receiver__title">收货地址</div>
      <div class="top__receiver__address">西安一二三大学四五六科技园2号楼</div>
      <div class="top__receiver__info">
        <span class="top__receiver__info__name">张三(先生)</span>
        <span class="top__receiver__info__phone">18012341234</span>
      </div>
      <span><i class="custom-icon custom-icon-back"></i></span>
    </div>
  </div>
</template>

<script>
// import { ref } from 'vue'
export default {
  name: 'OrderConfirmation'
}
</script>
image.png

接下来增加样式:

<style lang="scss" scoped>
.top {
  height: 1.96rem;
  background-size: 100% 1.59rem;
  /* 渐变轴为0度,相当于从下到上,
   高度4%位置从rgba(0, 145, 255, 0) 开始渐变
   到高度50%位置的蓝色(#0091ff)结束 */
  background-image: linear-gradient(0deg, rgba(0, 145, 255, 0) 4%, #0091ff 50%);
}
</style>
image.png

这里背景超出长度会显示原来的蓝色。
优化如下:

<style lang="scss" scoped>
.top {
  height: 1.96rem;
  background-size: 100% 1.59rem;
  /* 渐变轴为0度,相当于从下到上,
   高度4%位置从rgba(0, 145, 255, 0) 开始渐变
   到高度50%位置的蓝色(#0091ff)结束 */
  background-image: linear-gradient(0deg, rgba(0, 145, 255, 0) 4%, #0091ff 50%);
  background-repeat: no-repeat;
}
</style>

image.png

增加样式:

<style lang="scss" scoped>
.top {
......
  &__header {
    padding-top: 0.4rem;
    line-height: 0.24rem;
    color: #fff;
    text-align: center;
  }
}
</style>
image.png

进一步微调

<template>
  <div class="top">
    <div class="top__bgcolor" />
    <div class="top__header">
      <div class="top__header__back">
        <i class="custom-icon custom-icon-back"></i>
      </div>
      <span>确认订单</span>
    </div>
......
  </div>
</template>
<style lang="scss" scoped>
.top {
......
  &__header {
    position: relative;
    padding-top: 0.4rem;
    line-height: 0.24rem;
    color: #fff;
    text-align: center;
    font-size: 0.16rem;
    &__back {
      position: absolute;
      font-size: 0.22rem;
      left: 0.18rem;
    }
  }
}
</style>
image.png

以上是模拟器的效果,考虑到真机浏览器的大小本来就会给上部留白,这里微调一下距上的距离:

  &__header {
......
    padding-top: 0.26rem;
......
    &__back {
......
    }
  }
image.png

进一步,优化收货信息:

<template>
  <div class="wrapper">
    <div class="top">
      <div class="top__bgcolor" />
      <div class="top__header">
        <div class="top__header__back">
          <i class="custom-icon custom-icon-back"></i>
        </div>
        <span>确认订单</span>
      </div>
      <div class="top__receiver">
        <div class="top__receiver__title">收货地址</div>
        <div class="top__receiver__address">
          西安一二三大学四五六科技园2号楼
        </div>
        <div class="top__receiver__info">
          <span class="top__receiver__info__name">张三(先生)</span>
          <span class="top__receiver__info__phone">18012341234</span>
        </div>
        <span><i class="custom-icon custom-icon-back"></i></span>
      </div>
    </div>
  </div>
</template>

<script>
// import { ref } from 'vue'
export default {
  name: 'OrderConfirmation'
}
</script>
<style lang="scss" scoped>
.wrapper {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: #eee;
}
.top {
  position: relative;
  height: 1.96rem;
  background-size: 100% 1.59rem;
  /* 渐变轴为0度,相当于从下到上,
   高度4%位置从rgba(0, 145, 255, 0) 开始渐变
   到高度50%位置的蓝色(#0091ff)结束 */
  background-image: linear-gradient(0deg, rgba(0, 145, 255, 0) 4%, #0091ff 50%);
  background-repeat: no-repeat;

  &__header {
    position: relative;
    padding-top: 0.26rem;
    line-height: 0.24rem;
    color: #fff;
    text-align: center;
    font-size: 0.16rem;
    &__back {
      position: absolute;
      font-size: 0.22rem;
      left: 0.18rem;
    }
  }
  &__receiver {
    position: absolute;
    left: 0.18rem;
    right: 0.18rem;
    bottom: 0rem;
    height: 1.11rem;
    background: #fff;
    border-radius: 0.04rem;
  }
}
</style>
image.png

继续优化其他信息:

<template>
  <div class="wrapper">
    <div class="top">
      <div class="top__bgcolor" />
      <div class="top__header">
        <div class="top__header__back">
          <i class="custom-icon custom-icon-back"></i>
        </div>
        <span>确认订单</span>
      </div>
      <div class="top__receiver">
        <div class="top__receiver__title">收货地址</div>
        <div class="top__receiver__address">
          西安一二三大学四五六科技园2号楼
        </div>
        <div class="top__receiver__info">
          <span class="top__receiver__info__name">张三(先生)</span>
          <span class="top__receiver__info__phone">18012341234</span>
        </div>
        <div class="top__receiver__icon">
          <i class="custom-icon custom-icon-back"></i>
        </div>
      </div>
    </div>
  </div>
</template>
......
<style lang="scss" scoped>
.wrapper {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: #eee;
}
.top {
......
  &__receiver {
    position: absolute;
    left: 0.18rem;
    right: 0.18rem;
    bottom: 0rem;
    height: 1.11rem;
    background: #fff;
    border-radius: 0.04rem;
    &__title {
      line-height: 0.22rem;
      padding: 0.16rem 0 0.14rem 0.16rem;
      font-size: 0.16rem;
      color: #333;
    }
    &__address {
      line-height: 0.2rem;
      padding: 0 0.4rem 0 0.16rem;
      font-size: 0.16rem;
      color: #333;
    }
    &__info {
      padding: 0.06rem 0 0 0.16rem;
      &__name &__phone {
        margin-right: 0.1rem;
        line-height: 0.18rem;
        font-size: 0.12rem;
        color: #666;
      }
    }
    &__icon {
      //旋转180度
      transform: rotate(180deg);
      position: absolute;
      right: 0.16rem;
      top: 0.5rem;
      font-size: 0.16rem;
      color: #666;
    }
  }
}
</style>
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容