用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){//当触发此事件是同样也是提交给manutationsthis.$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={ //求购物车中所有商品的总数量 //迭代相加 reducecount:(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;
转载于:https://www.cnblogs.com/cmy1996/p/9151528.html
用Vue来实现购物车功能(二)相关推荐
- 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果...
基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...
- vue实现简单购物车功能
先上代码,解析在后方 html部分: <!DOCTYPE html> <html lang="en"><head><meta charse ...
- vue实战记录(二)- vue实现购物车功能之创建vue实例
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...
- vue实战记录(六)- vue实现购物车功能之地址列表选配
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...
- 2020用vue实现仿美团导航切换功能和淘宝购物车功能,实现默认第一个导航显示效果?
总结:之前一直未写过同时实现跳转当前页面和跳转新页面的项目,要么是当前,要么是新页面,今天更新一个两个同时实现的项目. :相信很多人都遇到过router-link通过to跳转页面有时候会不显示内容的b ...
- 042——VUE中组件之子组件使用$on与$emit事件触发父组件实现购物车功能
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" ...
- vue实现一个简单的购物车功能
今天做了一个简单的购物车功能,主要用了计算属性,指令等知识点,代码如下: <template> <div><div id="cart" v-cloak ...
- 【Vue案例】——实现简易购物车功能
实现简易购物车功能 静态页面展示 商品详情页 购物车页面 购物车功能的实现 将商品添加至购物车 首先我们要在商品详情页为每一个商品的添加购物车按钮绑定一个点击事件,参数是该商品对象(将商品的所有属性包 ...
- 使用Vue和bootstrap实现简单购物车功能
使用Vue和bootstrap实现简单购物车功能 1.新建项目 2.app.vue 1.新建项目 创建vue vue create 项目名 引入bootstrap3 npm i bootstrap@3 ...
最新文章
- 一文详述Attention最新进展
- prometheus实战:
- 互联网大佬马老师于昨日教师节正式卸任,让位现任CEO张勇;华为发布新一代CloudLink视讯解决方案,普惠4K+AI;联通……...
- python redis 集群_python与java中使用redis集群
- 查看Windows上运行程序的异常日志
- CC2500大功率无线模块
- HBuilder快捷键整理集合
- 开关电源中开关管与二极管EMI抑制方法分析
- 声纹、语音识别入门书籍推荐
- 硬纪元干货|视+AR联合创始人涂意:AR将是下一代计算平台
- 5V升压充电8.4V芯片
- 【自动化】国内自动化与信息化产业仍有十年以上的产业繁荣;非标自动化业务你离BOSS只差一个认知
- Java 程序基本结构
- 艾兰岛编辑器-实体标签
- IOS10系统终于可以降级IOS9了,赶紧围观
- text-align: justify;text-align-last: justify;实现两端对齐
- ubuntu 部署ATX
- 访问 IIS 元数据库失败
- 复杂网络中重要节点挖掘方法综述
- STM32之CAN控制器
热门文章
- python工程技巧_重点来了!掌握这些Python技巧,将给你节省大量时间
- python函数和模块有什么关键特性_Python学习----第一模块笔记(Python基础知识)...
- 如何开启linux的dhcp服务器,怎么开启DHCP服务器啊
- 集群机器时间同步设置
- vb mysql ado_VB中的ADO数据对象编程详解
- mysql在linux下显示花_在Linux 中搭建 Mysql
- python全排列_全排列算法python实现
- html地图无法点击,无法触发谷歌地图标记点击事件从HTML按钮
- 华为 鸿蒙 操作系统关键特性解读
- 漫画科普:芯片是如何设计出来的