用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 ...
随机推荐
- CSS 毛玻璃效果
效果图: <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <met ...
- 剑指offer-顺序打印二叉树节点(系列)-树-python
转载自 https://blog.csdn.net/u010005281/article/details/79761056 非常感谢! 首先创建二叉树,然后按各种方式打印: class treeNo ...
- 08-Django加载静态文件
1.css文件以及js文件要放在static目录下,static和templates属于同级目录 2.在Django项目的同名项目文件的setting.py中,最后添加静态文件夹static目录路径 ...
- 转载 PowerDesigner导出mysql数据结构
转自:https://blog.csdn.net/dkingyaoyao/article/details/84586146 好久没有使用PowerDesigner,突然想用它导出数据结构,居然忘记了. ...
- node静态资源服务器的搭建----访问本地文件夹(搭建可访问静态文件的服务器)
我们的目标是实现一个可访问静态文件的服务器,即可以在浏览器访问文件夹和文件,通过点击来查看文件. 1.先创建一个文件夹anydoor,然后在该文件夹里npm init一个package.json文件, ...
- Python基础2——数据类型的操作
列表操作 列表.字符串.元组的切片总结: num=[1, 2, 3, 4, 5, 6] 1.切片是通过下面来切,下标可以正数,也可以是复数.注意:复数的话,最后一个值的下标为-1,往前面推导就是-1, ...
- DOMContentLoaded和load的区别
一.概念 DOMContentLoaded 当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表.图像和子框架的完成加载. load loa ...
- Windows及Android倍速播放视频软件下载
目录 1. 更多推荐 2. 关键字 3. 按 4. 软件下载 4.1. IOS应用商店 4.2. 网盘下载 5. 软件介绍 5.1. PotPlayer(Windows) 5.2. MoboPlaye ...
- strptime strftime时间函数总结
time(2) #include <time.h> time_t time(time_t *timep);//获取当前时间距离1970-01-01 00:00:00 经历的秒数 p = ...
- python json、pickle
文章部分转自:https://www.cnblogs.com/lincappu/p/8296078.html json:用于字符串和Python数据类型间进行转换pickle: 用于python特有的 ...