这个小demo具有添加商品进购物车 、增加购物车内商品的数量、减少购物车内商品的数量、计算一类商品的总价、以及计算所有商品的总价

首先看目录结构

因为我们的Tab.vue  Car.vue 以及Carinfo.vue中的数据有关联   所以用到了vuex

在store文件夹下的index.js中```

  1. import Vue from 'vue';
  2. import Vuex from 'vuex';
  3. import logger from 'vuex/dist/logger';
  4. Vue.use(Vuex);
  5.  
  6. // 状态
    //state里面存放的数据是cartList 这个cartList数据manuations和getter都能用到
  7. let state = {cartList:[]};
  8. import mutations from './mutations.js';
  9. import getters from './getters.js'
  10.  
  11. export default new Vuex.Store({
  12.   state,
  13.   mutations,
  14.   getters,
  15.   strict:true,
  16.   plugins:[logger()]
  17. });
  18. ```

在main.js里面引入store文件夹下的index.js

main.js文件内容

  1. import Vue from 'vue'
  2. import App from './App'
  3. import router from './router'
  4.  
  5. //购物车
  6. import store from './store'
  7.  
  8. /* eslint-disable no-new */
  9. new Vue({
  10. el: '#app',
  11. router,
  12. components: { App },
  13. template: '<App/>',
  14. store
  15. })

在store文件夹下的manutations-types.js文件

  1. //加入购物车的功能
  2.  
  3. //添加购物车(添加的商品)
  4. export const ADD_CART='ADD_CART';
  5. //删除购物车(要求传入id)
  6. export const REMOVE_CART='REMOVE_CART';
  7. //更改商品数量({id,1/-1})
  8. export const CHANGE_COUNT='CHANGE_COUNT';
  9. //清空购物车
  10. export const CLEAR_CART='CLEAR_CART';

List.vue组件

  1. <template>
  2. <div>
  3. <MHeader>列表页</MHeader>
  4. <div class="content" ref="scroll" @scroll="loadMore">
  5. <ul>
  6. <router-link v-for="(book,index) in books" :key="index" :to="{name:'detail',params:{bid:book.bookId}}" tag="li">
  7. <img v-lazy="book.bookCover">
  8. <div>
  9. <h4>{{book.bookName}}</h4>
  10. <p>{{book.bookInfo}}</p>
  11. <b>{{book.bookPrice}}</b>
  12. <div class="btn-list">
  13. <button @click.stop="remove(book.bookId)">删除</button>
  14. <button @click.stop="addCart(book)">添加进购物车</button>
  15. </div>
  16.  
  17. </div>
  18. </router-link>
  19. </ul>
  20. <div @click="More" class="More">加载更多</div>
  21. </div>
  22. </div>
  23. </template>
  24.  
  25. <script>
  26.  
  27. import * as Types from '../store/mutations-types.js'
  28.  
  29. export default {
  30.  
  31. methods:{
  32.  
  33. //点击添加进购物车按钮 触发此方法 发布订阅 添加指定图书进购物车Car.vue
  34. addCart(book){
  35. this.$store.commit(Types.ADD_CART,book)
  36. }
  37. }
  38.  
  39. }
  40.  
  41. </script>

在store文件夹下的manutations.js文件内容  添加指定商品进购物车

  1. import * as Types from './mutations-types.js';
  2. const mutations={
  3. //添加商品进购物车
  4. [Types.ADD_CART](state,book) {
  5. //book是添加的一本书 如果有这本书 累加的是数量 如果没有那么数量为1 放到cartList中
  6. //查找cartList里面有没有添加进来的那本书
  7. let product=state.cartList.find(item=>item.bookId===book.bookId);
  8. //如果有的话
  9. if(product) {
  10. product.bookCount+=1;
  11. //还要更新掉原数组 原数组里面有book内容和book 否则不会刷新
  12. state.cartList=[...state.cartList];
  13. }else {
  14. book.bookCount=1;
  15. //用新数组替换到老数组
  16. state.cartList=[...state.cartList,book]
  17. }
  18. }
  19. }
  20.  
  21. export default mutations;

Car.vue组件

  1. <template>
  2. <div>
  3. <MHeader>购物车</MHeader>
  4. <ul class="content">
  5. <li v-for="(l,index) in cartList" :key="index">
  6. <img :src="l.bookCover" alt="" style="width:120px;height:140px">
  7. <div class="right">
  8. <h3>{{l.bookName}}</h3>
  9. <button @click="delOneCart(l)">-</button><span>{{l.bookCount}}</span><button @click="addCart(l)">+</button>
          
          //计算此类商品的价钱
  10. <p>小计 :¥{{l.bookPrice*l.bookCount | numFilter}}</p>
  11. <button @click="delCart(l)">删除</button>
  12. </div>
  13. </li>
  14. </ul>
  15. <Carinfo></Carinfo>
  16. </div>
  17. </template>
  18. <script>
  19. import MHeader from '../base/MHeader.vue';
  20. import Carinfo from './Carinfo.vue';
  21.  
  22. import * as Types from '../store/mutations-types.js'
  23.  
  24. // 辅助函数 语法糖
  25. import {mapState,mapGetters} from 'vuex';
  26. export default {
  27. data(){
  28. return {msg: 'hello'}
  29. },
  30. created(){
  31. },
  32. filters:{//过滤器
  33. numFilter(value) {
  34. //截取当前数据到小数点后两位
  35. let realVal=Number(value).toFixed(2);
  36. return Number(realVal);
  37. }
  38. },
  39. methods: {
  40. addCart(l){//当触发此事件是同样也是提交给manutations
  41. this.$store.commit(Types.ADD_CART,l)
  42. },
  43. delOneCart(l){
  44. this.$store.commit(Types.CHANGE_COUNT,l);
  45. },
  46. delCart(l){
  47. this.$store.commit(Types.REMOVE_CART,l);
  48. }
  49. },
  50. computed: {
  51. ...mapGetters(['count','totolPrice']),
  52. ...mapState(['cartList'])
  53. /*cartList(){
  54. return this.$store.state.cartList
  55. }*/
  56. },
  57. components: {MHeader,Carinfo}
  58. }

manutaions.js

  1. import * as Types from './mutations-types.js';
  2. const mutations={
  3. [Types.ADD_CART](state,book) {
  4. //book是添加的一本书 如果有这本书 累加的是数量 如果没有那么数量为1 放到cartList中
  5. //查找cartList里面有没有添加进来的那本书
  6. let product=state.cartList.find(item=>item.bookId===book.bookId);
  7. //如果有的话
  8. if(product) {
  9. product.bookCount+=1;
  10. //还要更新掉原数组 否则不会刷新
  11. state.cartList=[...state.cartList];
  12. }else {
  13. book.bookCount=1;
  14. //用新数组替换到老数组
  15. state.cartList=[...state.cartList,book]
  16. }
  17. console.log('state.cartList',state.cartList);
  18. },
  19. [Types.CHANGE_COUNT](state,book) {
  20. let product=state.cartList.find(item=>item.bookId===book.bookId);
  21. if(product) {
  22. product.bookCount-=1;
  23. //还要更新掉原数组 否则不会刷新
  24. state.cartList=[...state.cartList];
  25. }
  26. },
  27. [Types.REMOVE_CART](state,book){
  28. state.cartList.forEach((item,i) => {
  29. if(item.bookId===book.bookId){
  30. state.cartList.splice(i,1);
  31. }
  32. });
  33. state.cartList=[...state.cartList];
  34. },
  35. [Types.CLEAR_CART](state){
  36. state.cartList=[];
  37. }
  38. }
export default mutations;
  1.  

Carinfo.vue

  1. <template>
  2. <div class="item-wrapper">
  3. <div class='item'>总数:
  4. <strong>{{count}}</strong>
  5. </div>
  6. <div class='item'>总价:
  7. <strong>{{totalPrice|numFilter}}</strong>
  8. </div>
  9. <button class="item btn btn-danger" @click="clearAll">清空购物车</button>
  10. </div>
  11. </template>
  12. <script>
  13.  
  14. import * as Types from '../store/mutations-types.js'
  15.  
  16. //两个辅助函数
  17. import {mapState,mapGetters} from 'vuex';
  18.  
  19. export default {
  20. data(){
  21. return {
  22.  
  23. }
  24. },
  25. filters:{
  26. numFilter(value) {
  27. //截取当前数据到小数点后两位
  28. let realVal=Number(value).toFixed(2);
  29. return Number(realVal);
  30. }
  31. },
  32. methods:{
  33. clearAll(){
  34. this.$store.commit(Types.CLEAR_CART);
  35. }
  36. },
  37. computed:{
  38. ...mapGetters(['count']),
  39. ...mapGetters(['totalPrice'])
  40. }
  41. }

Getter.js

  1. let getters={
  2. //求购物车中所有商品的总数量
  3. //迭代相加 reduce
  4. count:(state)=>state.cartList.reduce((prev,next)=>prev+next.bookCount,0),
  5. totalPrice:(state)=>state.cartList.reduce((prev,next)=>prev+next.bookCount*next.bookPrice,0)
  6. }
  7.  
  8. export default getters;

用Vue来实现购物车功能(二)的更多相关文章

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

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

  2. vue.js实现购物车功能

    购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...

  3. 用vue.js实现购物车功能

    购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...

  4. vue 入门 ------简单购物车功能实现(全选,数量加减,价格加减)

    简易购物车功能(无任何布局 主要是功能) 数量的加减 商品的总价钱 全选与全不选 删除(全选.价格 受影响) <script src="https://cdn.jsdelivr.net ...

  5. vue实战记录(二)- vue实现购物车功能之创建vue实例

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

  6. vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能

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

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

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

  8. vue实战记录(一)- vue实现购物车功能之前提准备

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

  9. vue实战记录(六)- vue实现购物车功能之地址列表选配

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

随机推荐

  1. CSS 毛玻璃效果

    效果图: <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <met ...

  2. 剑指offer-顺序打印二叉树节点(系列)-树-python

    转载自  https://blog.csdn.net/u010005281/article/details/79761056 非常感谢! 首先创建二叉树,然后按各种方式打印: class treeNo ...

  3. 08-Django加载静态文件

    1.css文件以及js文件要放在static目录下,static和templates属于同级目录 2.在Django项目的同名项目文件的setting.py中,最后添加静态文件夹static目录路径 ...

  4. 转载 PowerDesigner导出mysql数据结构

    转自:https://blog.csdn.net/dkingyaoyao/article/details/84586146 好久没有使用PowerDesigner,突然想用它导出数据结构,居然忘记了. ...

  5. node静态资源服务器的搭建----访问本地文件夹(搭建可访问静态文件的服务器)

    我们的目标是实现一个可访问静态文件的服务器,即可以在浏览器访问文件夹和文件,通过点击来查看文件. 1.先创建一个文件夹anydoor,然后在该文件夹里npm init一个package.json文件, ...

  6. Python基础2——数据类型的操作

    列表操作 列表.字符串.元组的切片总结: num=[1, 2, 3, 4, 5, 6] 1.切片是通过下面来切,下标可以正数,也可以是复数.注意:复数的话,最后一个值的下标为-1,往前面推导就是-1, ...

  7. DOMContentLoaded和load的区别

    一.概念 DOMContentLoaded 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表.图像和子框架的完成加载. load loa ...

  8. Windows及Android倍速播放视频软件下载

    目录 1. 更多推荐 2. 关键字 3. 按 4. 软件下载 4.1. IOS应用商店 4.2. 网盘下载 5. 软件介绍 5.1. PotPlayer(Windows) 5.2. MoboPlaye ...

  9. strptime strftime时间函数总结

    time(2) #include <time.h> time_t time(time_t *timep);//获取当前时间距离1970-01-01 00:00:00  经历的秒数 p = ...

  10. python json、pickle

    文章部分转自:https://www.cnblogs.com/lincappu/p/8296078.html json:用于字符串和Python数据类型间进行转换pickle: 用于python特有的 ...