先创建一个cart组件

<template>
<div>
<ListItem></ListItem>
</div>
</template> <script>
import ListItem from "./ListItem"; export default {
components: {
ListItem
},
data() {
return {}
},
// 在父组件中获取购物车数据
mounted() {
let url = 'http://localhost:8080/data/cart.json'
this.$axios.get(url).then(ret => {
// 给vuex发送一个异步请求,更新数据 vuex actions
this.$store.dispatch('cartData', ret.data)
})
}
}
</script>

在store文件夹index里面写上

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
// 数据源
state: {
cartData: [],
// 购物车总价格
cartTotalPrice: 0,
},
// 相当于组件中的计算属性
getters: {
// 这里是小计
cartData(state) {
return state.cartData.map(item => {
item.['total'] = item.price * item.num
return item
})
},
// 计算总价格
cartTotalPrice(state){
/* 开始可以这样写就是计算数量和价格 得出总价格
let total = 0
state.cartData.forEach(item => {
total += item.price * item.num
})
return total
*/
// prev 初始值 => 值取参2的值,当循环第2次时就是return和上一次返回值
// next 当前循环的对象
// 用于聚合运算 提高map reduce
return state.cartData.reduce((prev,next) => {
return prev + next.price * next.num
},0)
}
},
mutations:{
// 修改数据源
setCartData(state,data){
state.cartData = data
},
// 给数量加一
incr(state,index){
state.cratData[index].num++
},
// 给数量减一
decr(state,index){
state.cratData[index].num--
}
},
actions:{
cartData({commit},data){
// 让mutations更新state数据
commit('setCartData',data)
},
incr({commit},index){
commit('incr',index)
},
decr({commit},index){
commit('decr',index)
}
},
modules:{}
})


再创建ListItem组件 这个就是点击增加和删除功能的组件

<template>
<div>
<ul>
<!-- 直接使用计算属性里面的cartData数据 -->
<li v-for="(item, index) in cartData" :key="item.id">
<span>{{ item.name }}</span>
<span>{{ item.price }}</span>
<span>
<button @click="incr(index)">+++</button>
<input type="text" v-model="item.num" />
<button @click="decr(index, item.num)">---</button>
</span>
<span>小计:{{ item.total }}</span>
</li>
</ul>
<Total></Total>
</div>
</template> <script>
import { mapGetters } from 'vuex'
import Total from './Total'
export default {
components: { Total },
// 子组件中得到父组件中吧数据写入到vuex中的state数据 从而实现了组件间的通信(传值)
computed: {
...mapGetters(['cartData'])
},
methods: {
// index当前数据对象的索引号
incr(index) {
this.$store.dispatch('incr', index)
},
decr(index, num) {
if (num > 1) {
this.$store.dispatch('decr', index)
}
}
}
}
</script> <style></style>

再创建Total组件就是总计的组件

<template>
<div>
总计:{{ cartTotalPrice }}
</div>
</template> <script>
import {mapGetters} from 'vuex'
export default {
computed:{
...mapGetters(['cartTotalPrice'])
}
}
</script> <style scoped> </style>

这样每个的小计和全部加起来的价格都被vuex管理起来了

vuex做购物车功能的更多相关文章

  1. 用vuex实现购物车功能

    效果图 展示目录结构 product组件(纯静态代码) cart组件(纯静态代码) info组件(纯静态代码) 完成以上的三个组件,现在要开始调用这些组件,在App.vue中调用 如果你的姿势正确的话 ...

  2. vuex实现购物车功能

    购物车功能描述: 1. 点击+,-按钮,“已选:xx件”随之增减 2. checkbox选中时,当前项的已选数量增加到头部“已选择xx件”中,未选中时数量不计入 代码: 服务端 node+koa+ko ...

  3. 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果

    基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...

  4. Vue+Vant+Vuex实现本地购物车功能

    通常,我们做移动端商城的时候,通常会有购物车模块,那购物车模块有两种实现方式,一是储存在后台通过接口获取到购物车信息,二是存在用户手机本地,第一种方法只要调用接口获取比较简单,这里介绍的是第二种方法, ...

  5. Android 购物车功能的实现

    首先,众所周知,ListView是Android最常用的控件,可以说是最简单的控件,也可以说是最复杂的控件. 作为一个Android初级开发者,可能会简单的ListView展示图文信息. 作为一个有一 ...

  6. ASP.NET之电子商务系统开发-2(购物车功能)

    一.前言 继上次的首页数据列表后,这是第二篇.记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的. 二.开始 首先看一下购物车流程及对 ...

  7. Vue(小案例_vue+axios仿手机app)_Vuex优化购物车功能

    一.前言         1.用vuex实现加入购物车操作 2.购物车详情页面          3.点击删除按钮,删除购物详情页面里的对应商品 二.主要内容 1.用vuex加入购物车 (1)在src ...

  8. vue实战记录(三)- vue实现购物车功能之渲染商品列表

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...

  9. vue实现淘宝购物车功能

    淘宝购物车功能,效果如下图 非常简单的逻辑,没有做代码的封装,代码如下 <div class="list-container"> <div class=" ...

  10. php 实现简单购物车功能(2)

    上一篇的时候只是写了简单的加入购物车功能,购物车中产品的删除.提交订单后,库存的减少 以及客户账户的余额都没有完善, 这一篇是接着完善上一篇的,上一篇写到了购物车中删除的功能了,为了使删除的代码少敲一 ...

随机推荐

  1. Linux下安装配置OpenResty服务器

    OpenResty是一款基于Nginx和Lua的高性能Web平台,在nginx基础之上集成了大量的lua库,第三方模块等,以便搭建各种处理高并发.可扩展的Web应用.服务或网关,并且OpenResty ...

  2. uniapp小程序页面实现元素与胶囊进行居中对齐

    无论是否为uni,关键在于获取胶囊中点的位置,如果是原生小程序根据小程序文档获取,其余逻辑处理是一致的 代码语法都只是技术选择,重点是逻辑处理,对于技术的运用,代码技术好比是积木,好的程序就是好的组合 ...

  3. leetcode插件问题

    1.使用一段时间后,提交答案一直返回undefind 原因为插件缓存token有效期已过,需要重新登录 2. 重新登录

  4. Serverless 场景下 Pod 创建效率优化

    简介: 众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域.弹性能力是 Serverless 领域的核心竞争力,本次分享将重点介绍基于 ...

  5. 一文带你了解企业上云数据分析首选产品Quick BI

    简介: 阿里云Quick BI再度入选,并继续成为该领域唯一入选魔力象限的中国企业,文章将为大家详细介绍上云数据分析首选产品 Quick BI的核心能力. 日前,国际权威分析机构Gartner发布20 ...

  6. Flink 在爱奇艺广告业务的实践

    简介: 5 月 22 日北京站 Flink Meetup 分享的议题. 本文整理自爱奇艺技术经理韩红根在 5 月 22 日北京站 Flink Meetup 分享的议题<Flink 在爱奇艺广告业 ...

  7. Flink 在顺丰的应用实践

    ​简介: 顺丰基于 Flink 建设实时数仓的思路,引入 Hudi On Flink 加速数仓宽表,以及实时数仓平台化建设的实践. 本⽂由社区志愿者苗文婷整理,内容源⾃顺丰科技大数据平台研发工程师龙逸 ...

  8. [GPT] 哪些职业面临 AI 威胁?

      随着人工智能技术的不断发展和应用,一些重复性.机械化或标准化程度高的职业可能会面临被自动化取代的威胁.例如: 工厂生产线上的装配工人,因为许多工厂已经开始使用自动化机器人完成装配任务: 行政助理, ...

  9. [FE] uViewUI u-navbar 曲线解决 uni onNavigationBarButtonTap 的限制与失效

    uni 自带的 navigation bar 对于普通的导航需求是够用的,也允许 onNavigationBarButtonTap 加点击事件. 但是会出现异常Bug,表现为在内部页面一番操作后,再返 ...

  10. WPF 获取本机所有字体拿到每个字符的宽度和高度

    本文主要采用 GlyphTypeface 类尝试获取每个字符的宽度和高度的值,尽管这个方法和最终 WPF 布局使用的文本的宽度和高度是不相同的,但是依然可以作为参考 获取系统字体文件夹的文件 系统字体 ...