用Vue来实现购物车功能(二)
这个小demo具有添加商品进购物车 、增加购物车内商品的数量、减少购物车内商品的数量、计算一类商品的总价、以及计算所有商品的总价
首先看目录结构


因为我们的Tab.vue Car.vue 以及Carinfo.vue中的数据有关联 所以用到了vuex
在store文件夹下的index.js中```
import Vue from 'vue';
import Vuex from 'vuex';
import logger from 'vuex/dist/logger';
Vue.use(Vuex); // 状态
//state里面存放的数据是cartList 这个cartList数据manuations和getter都能用到
let state = {cartList:[]};
import mutations from './mutations.js';
import getters from './getters.js' export default new Vuex.Store({
state,
mutations,
getters,
strict:true,
plugins:[logger()]
});
```
在main.js里面引入store文件夹下的index.js
main.js文件内容
import Vue from 'vue'
import App from './App'
import router from './router' //购物车
import store from './store' /* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>',
store
})
在store文件夹下的manutations-types.js文件
//加入购物车的功能 //添加购物车(添加的商品)
export const ADD_CART='ADD_CART';
//删除购物车(要求传入id)
export const REMOVE_CART='REMOVE_CART';
//更改商品数量({id,1/-1})
export const CHANGE_COUNT='CHANGE_COUNT';
//清空购物车
export const CLEAR_CART='CLEAR_CART';
List.vue组件
<template>
<div>
<MHeader>列表页</MHeader>
<div class="content" ref="scroll" @scroll="loadMore">
<ul>
<router-link v-for="(book,index) in books" :key="index" :to="{name:'detail',params:{bid:book.bookId}}" tag="li">
<img v-lazy="book.bookCover">
<div>
<h4>{{book.bookName}}</h4>
<p>{{book.bookInfo}}</p>
<b>{{book.bookPrice}}</b>
<div class="btn-list">
<button @click.stop="remove(book.bookId)">删除</button>
<button @click.stop="addCart(book)">添加进购物车</button>
</div> </div>
</router-link>
</ul>
<div @click="More" class="More">加载更多</div>
</div>
</div>
</template> <script> import * as Types from '../store/mutations-types.js' export default { methods:{ //点击添加进购物车按钮 触发此方法 发布订阅 添加指定图书进购物车Car.vue
addCart(book){
this.$store.commit(Types.ADD_CART,book)
}
} } </script>
在store文件夹下的manutations.js文件内容 添加指定商品进购物车
import * as Types from './mutations-types.js';
const mutations={
//添加商品进购物车
[Types.ADD_CART](state,book) {
//book是添加的一本书 如果有这本书 累加的是数量 如果没有那么数量为1 放到cartList中
//查找cartList里面有没有添加进来的那本书
let product=state.cartList.find(item=>item.bookId===book.bookId);
//如果有的话
if(product) {
product.bookCount+=1;
//还要更新掉原数组 原数组里面有book内容和book 否则不会刷新
state.cartList=[...state.cartList];
}else {
book.bookCount=1;
//用新数组替换到老数组
state.cartList=[...state.cartList,book]
}
}
} export default mutations;
Car.vue组件
<template>
<div>
<MHeader>购物车</MHeader>
<ul class="content">
<li v-for="(l,index) in cartList" :key="index">
<img :src="l.bookCover" alt="" style="width:120px;height:140px">
<div class="right">
<h3>{{l.bookName}}</h3>
<button @click="delOneCart(l)">-</button><span>{{l.bookCount}}</span><button @click="addCart(l)">+</button>
//计算此类商品的价钱
<p>小计 :¥{{l.bookPrice*l.bookCount | numFilter}}</p>
<button @click="delCart(l)">删除</button>
</div>
</li>
</ul>
<Carinfo></Carinfo>
</div>
</template>
<script>
import MHeader from '../base/MHeader.vue';
import Carinfo from './Carinfo.vue'; import * as Types from '../store/mutations-types.js' // 辅助函数 语法糖
import {mapState,mapGetters} from 'vuex';
export default {
data(){
return {msg: 'hello'}
},
created(){
},
filters:{//过滤器
numFilter(value) {
//截取当前数据到小数点后两位
let realVal=Number(value).toFixed(2);
return Number(realVal);
}
},
methods: {
addCart(l){//当触发此事件是同样也是提交给manutations
this.$store.commit(Types.ADD_CART,l)
},
delOneCart(l){
this.$store.commit(Types.CHANGE_COUNT,l);
},
delCart(l){
this.$store.commit(Types.REMOVE_CART,l);
}
},
computed: {
...mapGetters(['count','totolPrice']),
...mapState(['cartList'])
/*cartList(){
return this.$store.state.cartList
}*/
},
components: {MHeader,Carinfo}
}
manutaions.js
import * as Types from './mutations-types.js';
const mutations={
[Types.ADD_CART](state,book) {
//book是添加的一本书 如果有这本书 累加的是数量 如果没有那么数量为1 放到cartList中
//查找cartList里面有没有添加进来的那本书
let product=state.cartList.find(item=>item.bookId===book.bookId);
//如果有的话
if(product) {
product.bookCount+=1;
//还要更新掉原数组 否则不会刷新
state.cartList=[...state.cartList];
}else {
book.bookCount=1;
//用新数组替换到老数组
state.cartList=[...state.cartList,book]
}
console.log('state.cartList',state.cartList);
},
[Types.CHANGE_COUNT](state,book) {
let product=state.cartList.find(item=>item.bookId===book.bookId);
if(product) {
product.bookCount-=1;
//还要更新掉原数组 否则不会刷新
state.cartList=[...state.cartList];
}
},
[Types.REMOVE_CART](state,book){
state.cartList.forEach((item,i) => {
if(item.bookId===book.bookId){
state.cartList.splice(i,1);
}
});
state.cartList=[...state.cartList];
},
[Types.CLEAR_CART](state){
state.cartList=[];
}
}
Carinfo.vue
<template>
<div class="item-wrapper">
<div class='item'>总数:
<strong>{{count}}</strong>
</div>
<div class='item'>总价:
¥<strong>{{totalPrice|numFilter}}</strong>
</div>
<button class="item btn btn-danger" @click="clearAll">清空购物车</button>
</div>
</template>
<script> import * as Types from '../store/mutations-types.js' //两个辅助函数
import {mapState,mapGetters} from 'vuex'; export default {
data(){
return { }
},
filters:{
numFilter(value) {
//截取当前数据到小数点后两位
let realVal=Number(value).toFixed(2);
return Number(realVal);
}
},
methods:{
clearAll(){
this.$store.commit(Types.CLEAR_CART);
}
},
computed:{
...mapGetters(['count']),
...mapGetters(['totalPrice'])
}
}
Getter.js
let getters={
//求购物车中所有商品的总数量
//迭代相加 reduce
count:(state)=>state.cartList.reduce((prev,next)=>prev+next.bookCount,0),
totalPrice:(state)=>state.cartList.reduce((prev,next)=>prev+next.bookCount*next.bookPrice,0)
}
export default getters;
用Vue来实现购物车功能(二)的更多相关文章
- 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...
- vue.js实现购物车功能
购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...
- 用vue.js实现购物车功能
购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...
- vue 入门 ------简单购物车功能实现(全选,数量加减,价格加减)
简易购物车功能(无任何布局 主要是功能) 数量的加减 商品的总价钱 全选与全不选 删除(全选.价格 受影响) <script src="https://cdn.jsdelivr.net ...
- vue实战记录(二)- vue实现购物车功能之创建vue实例
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...
- vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...
- vue实战记录(三)- vue实现购物车功能之渲染商品列表
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...
- vue实战记录(一)- vue实现购物车功能之前提准备
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(一) GitHub:sue ...
- vue实战记录(六)- vue实现购物车功能之地址列表选配
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...
随机推荐
- HNUSTOJ-1437 无题
1437: 无题 时间限制: 1 Sec 内存限制: 128 MB提交: 268 解决: 45[提交][状态][讨论版] 题目描述 tc在玩一个很无聊的游戏:每一次电脑都会给一个长度不超过10^5 ...
- 【React 8/100】 React路由
React路由 React路由介绍 现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序.因为它的用户体验更好.对服务器压力更小,所以更受欢迎.为了有效的使用单个页面来管 ...
- lmhosts - samba的NetBIOS主机列表文件
lmhosts是一个samba的NetBIOS名字到IP地址映射文件. 描述 此文件是samba套件的一部分. lmhosts是一个samba的NetBIOS名字到IP地址映射文件.它与/etc/ho ...
- Quartus 中调用modelsim的流程及*.vt或*.vht自动生成
一.自动生成验证程序testbench的方法,setting-EDA Tool->simylation->选择对应的语言(verilog对应*.vt,VHDL对应*.vht)process ...
- Codeforces1221D. Make The Fence Great Again(dp)
题目链接:传送门 思路: 仔细想一下可以发现:每个位置最多就增加2个高度. 所以就可以有状态: f[i][j]表示保证前i个篱笆都是great时,第i个篱笆增加j的高度所需要的最小花费(1 <= ...
- 代理层Nginx限流(降级)预案
典型服务架构介绍 预案适用场景 监控指标 操作手册 相关文档 操作方法 配置语法 配置样例 配置解释 注意事项 典型服务架构介绍 典型的互联网服务访问链路都是分层结构的,从流量入口,到应用层,到后端资 ...
- 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- java Character类源码分析
一.使用 构建Character对象: public class CharTest { public static void main(String[] args) { Character c1 = ...
- spark-2.1.1 yarn(高可用)搭建
一.概述 spark分布式搭建方式大致分为三种:standalone.yarn.mesos.三种分类的区别这里就不一一介绍了,不明白可自行了解.standalone是官方提供的一种集群方式,企业一般不 ...
- LeetCode--064--最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入:[ [1,3,1], [1,5,1], ...