添加商品到购物车 Vuex

2023-10-26

商品详情/购物车页面 code

<template>
	<div class="home">购物车车
		<button @click="addGood(1)">Add Good1</button>
		<button @click="addGood(2)">Add Good1</button>
		<button @click="addGood(3)">Add Good1</button>
		<ul>
			<li v-for="(item, index) in cartList"><input type="checkbox" v-model="item.selected" />{{item}} <button @click="sub(index)" :disabled="item.count <= 1">-</button>{{item.buyNumber}}<button @click="add(index)">+</button><button @click="deleteBook(index)">删除</button> </li>
		</ul>
		<p><input type="checkbox" :checked="isSelectAll" @click="selectAllClick" /> 全选</p>
		<p>共计:{{totalPrice}}  选中 {{checkedLength}}</p>
	</div>
</template>
<script type="text/javascript">
import { mapGetters, mapActions } from 'vuex'
export default {
	name: "Cart",
	data() {
		return {}
	},
	methods: {
		...mapActions(['addToCart']), //mapActions 辅助函数,直接用 vueX 中 Action 的函数
		addGood(id) {
			const good = {
				name: "商品" + id,
				id: id,
				desc: "商品" + id + "描述",
				price: id
			}
			this.addToCart(good);
		},
		add(index) { this.$store.commit('addGoodNum', index); },
		sub(index) { this.$store.commit('subGoodNum', index); },
		deleteBook(index) { this.$store.commit('removedGood', index); },
		selectAllClick() {
			if (this.isSelectAll) { //全选
				this.cartList.forEach(item => item.selected = false);
			} else { //全不选
				this.cartList.forEach(item => item.selected = true);
			}
		}
	},
	computed: {
		...mapGetters(['cartList', 'totalPrice']), //mapGetter 辅助函数
		checkedLength(){ //得到选中的商品的数量
			return this.cartList.filter(item => item.selected).length;
		},
		isSelectAll(){
			console.log("1");
			if(this.cartList.length == 0) return false;
			return !(this.cartList.filter(item => !item.selected).length);
		}
	},
	
}

</script>
<style scoped>
.home {
	height: 100vh;
	position: relative;
}

</style>

store/index.js code

import Vue from 'vue'
import Vuex from 'vuex'

//1.安装插件
Vue.use(Vuex)

//2.创建对象
const store = new Vuex.Store({
	state: { //这里放置全局变量
		cartList: [],
	},
	mutations: {
		addGoodToCartList(state, good) {
			good.selected = true; //添加商品的时候将购物车的选择状态设置为选中
				state.cartList.push(good);
		},
		addGoodNum(state, index) { //添加商品数量
			state.cartList[index].count++;
		},
		subGoodNum(state, index) { //减少商品数量
			state.cartList[index].count--;
		},
		removedGood(state, index) { //添加商品数量
			state.cartList.splice(index, 1);
		},
	},
	actions: {
		addToCart(content, good) { //逻辑都写在 action 中,让 mutation 只执行最简单的操作 
			//查找之前数组中是否有该商品
			let oldProduct = content.state.cartList.find(item => {
				return item.id == good.id;
			})
			//如果之前有该商品,则数量加1
			if (oldProduct) {
				oldProduct.count += 1;
			} else {
				good.count = 1;
				content.commit('addGoodToCartList', good);
			}
		}
	},
	getters: {
		cartList(state) {
			//得到列表,在使用的页面 引入 import {mapGetters} from 'vuex'	 
			//...mapGetters(['cartList']) 

			return state.cartList;
		},
		totalPrice(state) {
			//总价(用 good.selected 来判断下用户是否选中了该商品)
			//map: 相当于普通的遍历,会把函数的返回值赋给新数组 
			//reduce: 对数组中的所有内容进行汇总,这里的最后的 0 是给 preValue 一个初始化的值,这里执行的是一个递归的操作
			let total = state.cartList.map(good => good.selected ? good.price * good.count : 0).reduce((preValue, goodPrice) => preValue + goodPrice, 0);
			return '¥' + total.toFixed(2);
		}
	}
});
//3.导出 store  
export default store

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加商品到购物车 Vuex 的相关文章

  • 检查节点js中特定时区的午夜

    比方说 我有用户的时区 时区 America New York 我想根据用户的时区在午夜执行一些任务 如何检查该时区是否已到达午夜 特定时区的最后午夜 new Date new Date toLocaleDateString en US t
  • 使用 grunt 从 browserify 生成源映射

    我已按照此处的说明进行操作 https www npmjs org package grunt browserify https www npmjs org package grunt browserify 尝试在 grunt 上为 bro
  • 修复js“脚本错误”

    我在实现一些简单的事情时遇到困难 我有一个 index html 文件http 本地主机 3200 http localhost 3200由 ruby on Rails 编写 它使用 javascript 文件http 本地主机 8000
  • 圆半便士? [复制]

    这个问题在这里已经有答案了 可能的重复 向上舍入最接近的 0 10 https stackoverflow com questions 2206335 round up nearest 0 10 JavaScript 中的数字四舍五入到小数
  • 不使用用户代理字符串检测 Google TV

    我们有一个客户希望将其内容发布到 Google TV 通过 Chrome 浏览器 但法律限制其在 常规网络 上发布 因此 我们希望通过 Javascript 检测 Google TV 浏览器 如果没有检测到 则禁止播放该内容 第一个想法是检
  • 请参阅在 JSDoc 中键入不同的文件而不导入

    我正在 Visual Studio Code 中编写 JavaScript ES6 代码 并启用 VSCode 的类型检查 如VSCode 文档 https code visualstudio com docs languages java
  • 用渐变色绘制一个 D3 圆

    如何用渐变颜色画一个圆 比如说 从黄色到蓝色的渐变 通常 要创建黄色圆圈 我们可以使用以下代码 var cdata 50 40 var xscale 40 var xspace 50 var yscale 70 var svg d3 sel
  • 如何在javascript中将两个大数相加?

    我有两个文本框 每个将接受最多千位数字的输入 现在我想将这两个数字相加 我的问题是我应该使用什么数据类型来存储结果 我已经尝试过这个 但我得到的结果是指数形式的 如何存储结果并显示 这是另一种解决方案 因为它更快 更干净 function
  • 如何拦截来自 iframe 的 http 请求?

    我以编程方式在网页中设置 iframe 的 URL 我必须知道此 URL 更改会触发哪些 http 请求 CSS 脚本 图像等加载的 URL 我拦截了 XMLHttpRequest 但这个对象从未被调用过 如何拦截这些http请求 是否有另
  • JavaScript/jQuery - offsetLeft 和 offsetTop

    当鼠标悬停在跨度上时 我想获取 offsetLeft 和 offsetTop 值 以便我可以将某些东西悬停在它附近 当我这样做时 两个值都为 0 有什么更好的方法来解决这个问题 我正在使用 jQuery 假设我开始 由服务器端脚本循环 sp
  • 递归算法无法在指定时间内完成测试

    我正在进行一项测试 需要二进制断层扫描算法 提供了一组 38 个测试值来测试正确性 但完成所有测试也有 1 CPU 秒的时间限制 问题如下 如果存在 m n 矩阵 A 且每个元素为 0 或 1 则输出 Yes 使得 否则输出 否 对于每个测
  • AngularJS 阻止 symfony2 表单中的提交按钮

    我在 symfony2 中创建了表单 最后呈现了提交表单的按钮 当我添加ng app myApp 一切正常 但我无法提交此页面上的表单 为什么会这样以及如何解锁 FORM gt add company choice array mapped
  • 在 javascript 中格式化日期直至毫秒

    我们正在使用来自 Microsoft 的以下 js 库https ajax aspnetcdn com ajax 4 0 1 MicrosoftAjax js https ajax aspnetcdn com ajax 4 0 1 Micr
  • NodeJS 获取承诺回调挂起

    我有这个代码 fetch url then response gt const json response json console log simplest possible fetch json json where 在控制台中我得到
  • 离子范围滑块 2.0.3

    我正在尝试使用离子范围滑块 2 0 3 URL http ionden com a plugins ion rangeSlider demo advanced html http ionden com a plugins ion range
  • 打开新浏览器窗口的最佳方式是什么?

    我知道大多数链接应该留给最终用户来决定如何打开 但我们不能否认有时您几乎 必须 强制进入新窗口 例如以表单形式维护数据 在当前页面 我想知道的是关于在新浏览器窗口中打开链接的 最佳 方式的共识是什么 我知道 a href url targe
  • 使用 jQuery 替换 XMLHttpRequest

    我对 JavaScript 库还很陌生 我想用 jQuery 替换我当前的代码 我当前的代码如下所示 var req function createRequest var key document getElementById key va
  • Ajax请求成功但结果为空

    我正在构建一个 Google Chrome 浏览器扩展 它使用 ajax请求将数据从网页发送到我的服务器 当前使用本地主机托管 这content script js在网页上下文中执行的文件 有关内容脚本的更多信息 http develope
  • 如何在fabricJS中通过鼠标选择被覆盖的对象?

    我正在尝试开发一种方法来选择分层在下面并 完全 被其他对象覆盖的对象 一种想法是选择顶部对象 然后通过doubleclick向下穿过层层 这就是我现在得到的 var canvas new fabric Canvas c fabric uti
  • Javascript ResizeObserver 意外触发

    Why the ResizeObserver类总是首先执行处理程序observe 尝试在 Chrome 开发工具上执行以下代码 new ResizeObserver gt console log resize detected observ

随机推荐

  • 使用VirtualBox安装Ubuntu虚拟机 - 完整教程

    前言 本教程将演示通过 VirtualBox 安装 Ubuntu 请提前下载好以下文件哦 VirtualBox 软件 Ubuntu 的 镜像文件 iso 下载地址 VirtualBox 版本 VirtualBox 7 0 2 官网链接 ht
  • eclipse常用快捷键

    Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合 通过这些组合可以更加容易的浏览源代码 使得整体的开发效率和质量得到提升 1 ctrl shift r 打开资源 这可能是
  • 如何安装iGG

    优点 1 安装 iGG 不能访问视频网站 但可以支持GG学术 GG搜索进行学术研究 2 作为GG扩展程序客户端只用登陆一次 非常便捷 3 性价比高 充值会员手机端也可以安装使用 步骤
  • 学习大数据所需的关键知识

    在人工智能领域 学习大数据技术是一项重要的任务 随着数据的快速增长和各行各业对数据的需求不断增加 掌握大数据技术可以帮助我们有效地处理 存储和分析海量数据 本文将介绍学习大数据所需的关键知识 并提供相应的源代码示例 数据存储和处理 在学习大
  • 【背包问题】之01背包和完全背包

    文章目录 1 01 背包 1 1 题目描述 1 2 基本思路 1 3 空间上的优化 1 4 算法实现 1 5 递归版本 1 6 按照递归修改的动态规划版本 1 7 总结 2 完全背包 2 1 题目描述 2 2 基本思路 2 3 优化一下 2
  • C语言:冒泡排序法:将若干字符串按字母顺序(由小到大)排序输出

    include
  • 大二上详细计划(量化到周)

    目录 前言 统筹安排 每周量化 每周进度 总体 花絮 前言 1 思来想去 决定对大二上的四个月进行一个安排 量化每周任务 具体到一本书看多少页 一套视频学多少 每个节点任务完成度 2 我们都是思想上的巨人 行动上的矮子 各种各样的欲望会阻碍
  • SpringCloud:Gateway之StripPrefix使用

    StripPrefix 过滤配置 很多时候也会有这么一种请求 用户请求路径是 api goods 而真实路径是 goods 这时候我们需要去掉 api才是真实路径 此时可以使用StripPrefix功能来实现路径的过滤操作 如下配置 ser
  • c语言时间序列预测,2.5.2 扩展案例:预测离散值时间序列

    2 5 2 扩展案例 预测离散值时间序列 假设我们观察到取值为0或1的数据 每个时刻一个值 为了了解具体应用 假设这是每天的天气数据 1代表有雨 0代表没有雨 假设已经知道最近几天是否下雨 我们希望预测明天是否会下雨 具体而言 对于某个k值
  • C++指针

    指针是一个存放内存地址的变量 通过指针 可以间接操作其它变量 指针的常用操作 int a 0 定义一个变量 int p a 定义一个指针 并指向a p 1 通过指针间接操作a 此时a 1 注意 p的类型是int 访问区域为4字节 Ps in
  • Revit二次开发--过滤对象(Revit 2014)

    1 获取元素的ID 通过UIDocument的Selection属性获取当前视图中选中的元素的ID 类型 using System using System Collections Generic using System Linq usi
  • QT - QML 遇到 module “QtQuick.Controls“ version 2.5 is not installed 的相关问题的解决策略

    问题由来 在跟着视频敲代码时 需要用到 DelayButton 这个控件 因此需要导入相关的库模块 跟着视频敲的是import QtQuick Controls 2 5 但可能由于版本较低的原因没有安装这个库模块 根据输入提示 有个 imp
  • STM32F407的CAN通信实验CAN1CAN2的设置

    CAN2的初始化参照上一篇博文就OK了 需要修改的地方 配置过滤器 CAN FilterInitStructure CAN FilterNumber 14 那为什么要修改额 查datasheet 双 CAN CAN1 主 bxCAN 用于管
  • Flex应用程序启动详解

    编写一个简单的Flex应用程序并不复杂 就算你从来没接触过Flex程序设计 照着帮助的实例步骤 不需花多长时间也能做出一个漂亮简捷的小程序出来 不过 随着对Flex程序编写的深入 会越来越觉得 其实要编写一个好的Flex应用程序并不简单 涉
  • uniapp切片-可视化设计工具(一套代码编译到7个平台iOS、Android、H5、小程序)

    uni app 是一个使用 Vue js 开发跨平台应用的前端框架 开发者编写一套代码 可编译到iOS Android H5 小程序等多个平台 一套代码编到7个平台 难以置信吗 依次扫描7个二维码 亲自体验最全面的跨平台效果 uni app
  • C++之sort()函数详解,刷题必备~

    顾名思义 sort就是用来排序的函数 它根据具体情形使用不同的排序方法 效率较高 一般来说 不推荐使用C语言中的qsort函数 原因是qsort用起来比较烦琐 涉及很多指针的操作 而且sort在实现中规避了经典快速排序中可能出现的会导致实际
  • C# 中的sealed修饰符学习

    转载原地址 http developer 51cto com art 200908 147327 htm C 语言还是比较常见的东西 这里我们主要介绍C sealed修饰符 包括介绍两个修饰符在含义上互相排斥用于方法和属性等方面 C sea
  • python爬虫网络出错怎么办_Python爬虫异常处理

    100 继续 客户端应当继续发送请求 客户端应当继续发送请求的剩余部分 或者如果请求已经完成 忽略这个响应 101 转换协议 在发送完这个响应最后的空行后 服务器将会切换到在Upgrade 消息头中定义的那些协议 只有在切换新的协议更有好处
  • linux上redis常用命令以及遇到的问题

    1 在linux上解压缩后使用make命令进行编译的时候 错误类型 zmalloc h 50 31 致命错误 jemalloc jemalloc h 没有那个文件或目录 原因是因为编译的时候Linux默认内存分配器是jemalloc 而Re
  • 添加商品到购物车 Vuex

    商品详情 购物车页面 code