美文网首页
Vue + Vuex 实现购物车

Vue + Vuex 实现购物车

作者: cemcoe | 来源:发表于2020-04-28 21:16 被阅读0次
购物车demo

功能点拆分

  • 在商品详情页点击添加购物车按钮,对应商品将传到购物车页面
  • 购物车页面顶部商品数量展示
  • 购物车页面商品列表展示
  • 商品选择和取消选择
  • 底部对选择的商品进行金额合计

购物车的逻辑

用户在首页看到感兴趣的商品,会点击进入到商品详情页,在对商品进一步了解之后,会将商品添加到购物车,此时购物车要展示用户选择的商品列表。

逻辑还是很复杂的,涉及了三个页面的交互:首页,详情页,购物车页面。

问题的关键是如何将用户选择的商品数据传递到购物车组件。

学过父子组件的数据传递,比如用户在首页点击时通过 router 将商品的 iid 传到详情页面,详情页面给根据 iid 向后端拿数据。

// GoodsListItem.vue
// 首页商品被点击
this.$router.push('/detail/' + this.goodsItem.iid)

// Detail.vue
// 拿到用户点击商品的iid
<detail-bottom-bar @addCart="addToCart" />
this.iid = this.$route.params.iid

// DetailBottomBar.vue
// 点击添加到购物车
this.$emit("addCart")

Detail 是个大组件,数据请求由它来完成。

可是商品详情页和购物车界面并没有构成明确的父子关系。

这时可以借助 Vuex 进行状态管理,状态管理有点术语了,其实可以将其当成一个全局的数据对象。

Vuex

Vuex 的出现打破了组件之间的阶级,哪个组件都可以向 Vuex 直接索要数据。

监听加入购物车

在detail-bottom中监听点击事件,将该事件传给父组件detail,在detail中构建数据类型,并通过 store 将其写入到 vuex 中。

// Detail.vue
// 1.获取购物车需要展示的商品信息
const product = {}
product.image = this.topImages[0]
product.title = this.goodsInfo.title
product.desc = this.goodsInfo.desc
product.price = this.goodsInfo.realPrice
product.iid = this.iid
console.log("你将要添加到购物车里的商品", product)
// 2.传到Vuex中
this.$store.dispatch("addCart", product)

Vuex中初始化了购物车商品列表,当拿到Detail.vue传来的商品信息后,该商品将被添加到该商品列表。

当然,这里有些条件需要判断,如果列表中已有该商品,那么只需将商品的数量加1即可。

对于新的产品类型,对其加入数量属性并初始化为1。

顶部数量展示

顶部数量展示
import { mapGetters } from "vuex"
  computed: {
    ...mapGetters({
      length: "cartLength",
      list: "cartList"
    })
  }
// length 顶部商品数量
// list 商品列表

商品列表展示

商品列表展示
<!-- GoodList.vue 拿到 cartList -->
<script>
computed: {
  ...mapGetters(["cartList"])
}
</script>

<!-- 将单个的商品数据传给 cartListItem.vue -->
<cart-list-item 
v-for="(item, index) in cartList" 
:key="index"
:item-info="item">
</cart-list-item>

<!-- cartListItem.vue 接收单个商品数据并展示 -->
<script>
props: {
  itemInfo: {
    type: Object,
    default() {
      return {}
    }
  }
</script>
<div class="item-img">
<img :src="itemInfo.image" alt="商品图片">
</div>
<div class="item-info">
<div class="item-title">
  {{itemInfo.title}}
</div>
<div class="item-dess">
  {{itemInfo.desc}}
</div>
<div class="info-bottom">
  <div class="item-price left">
    {{itemInfo.price}}
  </div>
  <div class="item-count right">
    x{{itemInfo.count}}
  </div>
</div>

下篇商品选择和取消选择,总金额计算,计算商品数量,计算金额。

相关文章

  • Vuex 状态管理

    Vue组件间通信方式 Vuex核心概念和基本使用 购物车案例 模拟实现vuex 一、组件内的状态管理流程 状态管理...

  • Vue + Vuex 实现购物车

    功能点拆分 在商品详情页点击添加购物车按钮,对应商品将传到购物车页面 购物车页面顶部商品数量展示 购物车页面商品列...

  • Vue + Vuex 实现购物车2

    上篇完成了商品从详情页添加到购物车界面的逻辑,现在在购物车界面已经可以拿到购物车里的商品列表,现在要处理在购物车界...

  • vuex

    官方推荐的数据框架:在vue的开发中 vue实现视图层的开发,vuex来实现数据层,实现数据共享 vuex是整个虚...

  • 用vuex写了一个购物车H5页面

    通过购物车的一个案列,把vuex学习了一篇。 ### vuex概念浅谈 Vuex 是一个专为 Vue.js 应用程...

  • vue全家桶实现原理

    一:vue-router(hash 实现) 二: vuex

  • vuex源码分析(一)——初始化vuex

    本文参考珠峰架构公开课之vuex实现原理 vuex是基于vue框架的状态管理。 如何在vue项目中初始化vuex?...

  • 浅谈vuex

    通过购物车的一个案列,把vuex学习了一篇。 vuex概念浅谈 Vuex 是一个专为 Vue.js 应用程序开发的...

  • 用vuex写了一个购物车H5页面

    通过购物车的一个案列,把vuex学习了一篇。 vuex概念浅谈 Vuex 是一个专为 Vue.js 应用程序开发的...

  • 用vuex写了一个购物车H5页面的示例代码

    通过购物车的一个案列,把vuex学习了一篇。vuex概念浅谈Vuex 是一个专为 Vue.js 应用程序开发的状态...

网友评论

      本文标题:Vue + Vuex 实现购物车

      本文链接:https://www.haomeiwen.com/subject/gepuwhtx.html