文章目录

  • 04-头部购物车-商品列表-本地
  • 05-头部购物车-删除操作-本地
  • 06-购物车页面-基础布局

04-头部购物车-商品列表-本地

目的:根据本地存储的商品获取最新的库存价格和有效状态。

大致步骤:

  • 定义获取最新信息的API
  • 定义修改购物车商品信息的mutations
  • 定义获取购物车列表信息的actions
  • 在头部购物车组件初始化的时候更新列表信息

落的代码:

  • 定义获取最新信息的API src/api/cart.js
import request from '@/utils/request'/*** 获取新的商品信息* @param {String} skuId - 商品SKUID* @returns Promise*/
export const getNewCartGoods = (skuId) => {return request(`/goods/stock/${skuId}`, 'get')
}
定义修改购物车商品信息的mutations src/store/module/cart.js// 修改购物车商品updateCart (state, goods) {// goods中字段有可能不完整,goods有的信息才去修改。// 1. goods中必需又skuId,才能找到对应的商品信息const updateGoods = state.list.find(item => item.skuId === goods.skuId)for (const key in goods) {if (goods[key] !== null && goods[key] !== undefined && goods[key] !== '') {updateGoods[key] = goods[key]}}}
  • 定义获取购物车列表信息的actions src/store/module/cart.js
    // 获取购物车列表findCartList (ctx) {return new Promise((resolve, reject) => {if (ctx.rootState.user.profile.token) {// 登录 TODO} else {// 本地// Promise.all() 可以并列发送多个请求,等所有请求成功,调用then// Promise.race() 可以并列发送多个请求,等最快的请求成功,调用then// 传参事promise数组const promiseArr = ctx.state.list.map(item => {// 返回接口函数的调用return getNewCartGoods(item.skuId)})Promise.all(promiseArr).then(dataArr => {dataArr.forEach((data, i) => {ctx.commit('updateCart', { skuId: ctx.state.list[i].skuId, ...data.result })})resolve()}).catch(e => {reject(e)})}})},
  • 再头部购物车组件初始化的时候更新列表信息 src/components/app-header-cart.vue
  setup () {const store = useStore()store.dispatch('cart/findCartList')}

05-头部购物车-删除操作-本地

目的:完成头部购物车删除操作,支持未登录状态。

大致步骤:

  • 编写mutaions删除购物车商品逻辑
  • 编写actions进行删除操作
  • 在头部购物车进行删除逻辑

落的代码:

  • vuex的mutations和actions代码 src/store/module/cart.js
  mutations: {// ... 省略// 删除购物车商品deleteCart (state, skuId) {const index = state.list.findIndex(item => item.skuId === skuId)state.list.splice(index, 1)}},
  actions: {// ... 省略// 删除购物车商品deleteCart (ctx, skuId) {return new Promise((resolve, reject) => {if (ctx.rootState.user.profile.token) {// 登录 TODO} else {// 本地ctx.commit('deleteCart', skuId)resolve()}})},
  • 头部组件实现删除逻辑 src/components/app-header-cart.vue
+ 购物车无商品不显示弹出层,并且不是在购物车页面
+<div class="layer" v-if="$store.getters['cart/validTotal']&&$route.path!=='/cart'">
+ 绑定点击事件传入skuId
+<i @click="deleteCart(item.skuId)" class="iconfont icon-close-new"></i>
  setup () {// 删除const deleteCart = (skuId) => {store.dispatch('cart/deleteCart', skuId).then(() => {Message({ type: 'success', text: '删除成功' })}).catch(e => {Message({ type: 'error', text: '删除失败' })})}return { deleteCart }}

06-购物车页面-基础布局

目的:完成购物车组件基础布局和路由配置与跳转链接。

大致步骤:

  • 完成头部组件,购物车图标,购物车结算按钮,点击跳转购物车路由。商品点击跳转详情的操作。
  • 配置购物车路由和组件,完成基础布局。

落的代码:

  • 跳转功能 src/components/app-header-cart.vue
    <RouterLink to="/cart" class="curr">
+      <i class="iconfont icon-cart"></i><em>{{$store.getters['cart/validTotal']}}</em></RouterLink>
        <div class="item" v-for="item in $store.getters['cart/validList']" :key="item.skuId">
+          <RouterLink :to="`/product/${item.id}`"><img :src="item.picture" alt="">
  <XtxButton type="plain" @click="$router.push('/cart')">去购物车结算</XtxButton>
  • 组件与路由 src/views/cart/index.vue
<template><div class="xtx-cart-page"><div class="container"><XtxBread><XtxBreadItem to="/">首页</XtxBreadItem><XtxBreadItem>购物车</XtxBreadItem></XtxBread><div class="cart"><table><thead><tr><th width="120"><XtxCheckbox>全选</XtxCheckbox></th><th width="400">商品信息</th><th width="220">单价</th><th width="180">数量</th><th width="180">小计</th><th width="140">操作</th></tr></thead><!-- 有效商品 --><tbody><tr v-for="i in 3" :key="i"><td><XtxCheckbox /></td><td><div class="goods"><RouterLink to="/"><img src="https://yanxuan-item.nosdn.127.net/13ab302f8f2c954d873f03be36f8fb03.png" alt=""></RouterLink><div><p class="name ellipsis">和手足干裂说拜拜 ingrams手足皲裂修复霜</p><!-- 选择规格组件 --></div></div></td><td class="tc"><p>&yen;200.00</p><p>比加入时降价 <span class="red">&yen;20.00</span></p></td><td class="tc"><XtxNumbox /></td><td class="tc"><p class="f16 red">&yen;200.00</p></td><td class="tc"><p><a href="javascript:;">移入收藏夹</a></p><p><a class="green" href="javascript:;">删除</a></p><p><a href="javascript:;">找相似</a></p></td></tr></tbody><!-- 无效商品 --><tbody><tr><td colspan="6"><h3 class="tit">失效商品</h3></td></tr><tr v-for="i in 3" :key="i"><td><XtxCheckbox style="color:#eee;" /></td><td><div class="goods"><RouterLink to="/"><img src="https://yanxuan-item.nosdn.127.net/13ab302f8f2c954d873f03be36f8fb03.png" alt=""></RouterLink><div><p class="name ellipsis">和手足干裂说拜拜 ingrams手足皲裂修复霜</p><p class="attr">颜色:粉色 尺寸:14cm 产地:中国</p></div></div></td><td class="tc"><p>&yen;200.00</p></td><td class="tc">1</td><td class="tc"><p>&yen;200.00</p></td><td class="tc"><p><a class="green" href="javascript:;">删除</a></p><p><a href="javascript:;">找相似</a></p></td></tr></tbody></table></div><!-- 操作栏 --><div class="action"><div class="batch"><XtxCheckbox>全选</XtxCheckbox><a href="javascript:;">删除商品</a><a href="javascript:;">移入收藏夹</a><a href="javascript:;">清空失效商品</a></div><div class="total">共 7 件商品,已选择 2 件,商品合计:<span class="red">¥400</span><XtxButton type="primary">下单结算</XtxButton></div></div><!-- 猜你喜欢 --><GoodRelevant /></div></div>
</template>
<script>
import GoodRelevant from '@/views/goods/components/goods-relevant'
export default {name: 'XtxCartPage',components: { GoodRelevant }
}
</script>
<style scoped lang="less">
.tc {text-align: center;.xtx-numbox {margin: 0 auto;width: 120px;}
}
.red {color: @priceColor;
}
.green {color: @xtxColor
}
.f16 {font-size: 16px;
}
.goods {display: flex;align-items: center;img {width: 100px;height: 100px;}> div {width: 280px;font-size: 16px;padding-left: 10px;.attr {font-size: 14px;color: #999;}}
}
.action {display: flex;background: #fff;margin-top: 20px;height: 80px;align-items: center;font-size: 16px;justify-content: space-between;padding: 0 30px;.xtx-checkbox {color: #999;}.batch {a {margin-left: 20px;}}.red {font-size: 18px;margin-right: 20px;font-weight: bold;}
}
.tit {color: #666;font-size: 16px;font-weight: normal;line-height: 50px;
}
.xtx-cart-page {.cart {background: #fff;color: #666;table {border-spacing: 0;border-collapse: collapse;line-height: 24px;th,td{padding: 10px;border-bottom: 1px solid #f5f5f5;&:first-child {text-align: left;padding-left: 30px;color: #999;}}th {font-size: 16px;font-weight: normal;line-height: 50px;}}}
}
</style>

Vue3电商项目实战-购物车模块2【04-头部购物车-商品列表-本地、05-头部购物车-删除操作-本地、06-购物车页面-基础布局】相关推荐

  1. Vue3电商项目实战-首页模块7【26-首页主体-商品区块、27-首页主体-最新专题、28-首页主体-图片懒加载】

    文章目录 26-首页主体-商品区块 27-首页主体-最新专题 28-首页主体-图片懒加载 26-首页主体-商品区块 目的: 完成商品区域展示. 大致步骤: 准备一个商品盒子组件 home-goods ...

  2. Vue3电商项目实战-结算支付 4【08-支付-支付页面-基础布局、10-支付-支付页面-信息展示、11-支付-支付流程】

    文章目录 08-支付-支付页面-基础布局 10-支付-支付页面-信息展示 11-支付-支付流程 08-支付-支付页面-基础布局 目的:配置路由和支付页面基础布局. src/views/member/p ...

  3. 测试从零开始-电商项目实战-用例设计篇No.1-[后台-用户列表]

    在之前的文章中,已经教大家搭建了电商网站,如果有没找到的,可以再私聊一下我.接下来,简单介绍一下,在公司中,一般我们怎么去开展测试. 这里我们抛开所有的理想状态,就只有这个项目的访问地址,数据库信息, ...

  4. Vue3电商项目实战-个人中心模块3【07-订单管理-tabs组件、08-订单管理-基础布局】

    文章目录 07-订单管理-tabs组件 08-订单管理-基础布局 07-订单管理-tabs组件 目的:封装一个高可用tabs组件 大致步骤: xtx-tabs 组件容器 可以有多个 xtx-tabs- ...

  5. Vue3电商项目实战-个人中心模块6【14-订单管理-查看物流、15-订单详情-头部展示】

    文章目录 14-订单管理-查看物流 15-订单详情-头部展示 14-订单管理-查看物流 目的:再订单列表,订单待收货,查询物流信息. 大致步骤: 定义查询物流的API函数 定义一个查看物流组件 在 o ...

  6. Vue3电商项目实战-商品详情模块6【17-商品详情-标签页组件、18-商品详情-热榜组件、19-商品详情-详情组件、20-商品详情-注意事项组件】

    文章目录 17-商品详情-标签页组件 18-商品详情-热榜组件 19-商品详情-详情组件 20-商品详情-注意事项组件 17-商品详情-标签页组件 目的:实现商品详情组件和商品评价组件的切换 大致步骤 ...

  7. Vue3电商项目实战-结算支付 3【05-结算-收货地址-添加、06-结算-收货地址-修改、07-结算-提交订单】

    文章目录 05-结算-收货地址-添加 06-结算-收货地址-修改 07-结算-提交订单 05-结算-收货地址-添加 目的:实现收货地址的添加. 大致步骤: 独立组件,准备一个对话框 完成表单布局 完成 ...

  8. 电商项目实战之商品秒杀

    电商项目实战之商品秒杀 定时任务 corn表达式 实现方式 基于注解 基于接口 实战 秒杀系统 秒杀系统关注问题 秒杀架构设计 商品上架 获取当前秒杀商品 获取当前商品的秒杀信息 秒杀最终处理 参考链 ...

  9. 软件测试电商项目实战(写进简历没问题)

    前言 说实话,在找项目的过程中,我下载过(甚至付费下载过)N多个项目.联系过很多项目的作者,但是绝大部分项目,在我看来,并不适合你拿来练习,它们或多或少都存在着"问题",比如: 1 ...

最新文章

  1. 71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP
  2. 当我们在讨论奢侈品行业时,人工智能可以做什么?
  3. python爬虫原理-python爬虫原理详细讲解
  4. 防止Stack smash的技术
  5. 苹果笔记本电脑好用吗_笔记本电脑市场格局重塑 可能比我们想象的来得更迅猛一些...
  6. 学起来 —— CSS 入门基础
  7. 【Linux】一步一步学Linux——traceroute命令(167)
  8. Kafka:常用命令
  9. 漫步线性代数二十五——特征值和特征向量
  10. python 爬虫性能_Python 爬虫性能相关总结
  11. [Ext JS6] Grid不同列的关联编辑
  12. HTML5尝鲜(1):使用aduio标签打造音乐播放器
  13. 编码风格之变量的命名规则
  14. 两个域名指向同一服务器的非80端口
  15. 智慧城市智能化建设发展现状及展望
  16. 在我们这个地方,你必须不停地奔跑,才能留在原地
  17. Fail2Ban 简介与使用
  18. 传感器故障下的滑模观测器的设计方法——Utkin观测器和Walcott-Zak 观测器
  19. 手工雕刻图纸_手工玉石雕刻图样大全
  20. gif透明背景动画_Gifox for Mac(Gif动图制作工具) v2.0.2

热门文章

  1. 完整的Java集合类的总结
  2. 微信公众号开发消息推送以及图文推送
  3. Deeplearning4j 实战 (21):Bert简介及NLP问题应用
  4. Javascript数组的创建
  5. thymeleaf案列
  6. 【Kay】1 数据仓库简介
  7. 纽约游轮观光:欣赏城市精华景点的轻松理想方式
  8. CNNs and Deep Q Learning
  9. 个人转让股权的十个常见问题
  10. 平板android怎么截屏,iPad怎么截屏 iPad截屏的3种方式