目录
购物车效果展示:
此项目添加、修改、删除数据的地方都写了浏览器都会把它存储起来
下次运行项目时会把浏览器数据拿出来并在页面展示
Video_20230816145047
购物车代码:
复制完代码,需改下script中引入的vue文件地址;可直接使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<div>
<form action="">
商品名称:<input type="text" v-model="productName" name="productName">
商品单价:<input type="text" v-model="productPrice" name="productPrice">
<input type="button" value="添加商品" @click="addProduct">
</form>
</div>
<ul>
<li v-for="(pro,index) in productList" :key="index">
商品名称:{
{pro.productName}}=========商品单价:{
{pro.productPrice}}
<button type="button" @click="addProToCart(index)">添加到购物车</button>
<button type="button" @click="deleteProToCart(index)">删除此商品</button>
</li>
</ul>
<cart :cartlist="cartList"></cart>
</div>
<template id="cartHtml">
<div>
<table border="1">
<tr>
<td>全选<input type="checkbox" @change="checkActive" id="isCheck"></td>
<td>商品名称</td>
<td>商品单价</td>
<td>商品数量</td>
<td>商品价格</td>
</tr>
<tr v-for="(pro,index) in cartlist" :key="index">
<td><input type="checkbox" v-model="pro.active" @change="ziCheck"></td>
<td>{
{pro.productName}}</td>
<td>{
{pro.productPrice}}</td>
<td>
<button type="button" @click="reduceProNum(index)">-</button>
{
{pro.productNum}}
<button type="button" @click="addProNum(index)">+</button>
</td>
<td>{
{pro.productPrice*pro.productNum}}</td>
</tr>
<tr>
<td colspan="3">选中的商品:{
{activeNum}}/{
{cartlist.length}}</td>
<td colspan="2">总价格:{
{totalPrice}}</td>
</tr>
</table>
</div>
</template>
</body>
<script src="../js/vue2.7.js"></script><!--根据自己的vue文件地址填写-->
<script>
//创建一个购物车子组件
var cart={
template:"#cartHtml",
props:["cartlist"],
methods:{
addProNum(index){
let product =this.cartlist[index];
product.productNum++
localStorage.setItem('cartList', JSON.stringify(this.cartlist));
},
reduceProNum(index){
let product =this.cartlist[index];
//判断商品数量是否为一
if (product.productNum==1) {
this.cartlist.splice(index,1)//为一,在数组中删除掉
//删除完后把数据放在浏览器里面把key值设置为cartList
localStorage.setItem('cartList', JSON.stringify(this.cartlist));
}else{
product.productNum--
//减完之后把数据放在浏览器里面把key值设置为cartList
localStorage.setItem('cartList', JSON.stringify(this.cartlist));
}
},
checkActive(){
if(document.getElementById("isCheck").checked){
for(var i=0;i<this.cartlist.length;i++){
this.cartlist[i].active=true;
}
//全选为true后把数据放在浏览器里面把key值设置为cartList
localStorage.setItem('cartList', JSON.stringify(this.cartlist));
}else{
for(var i=0;i<this.cartlist.length;i++){
this.cartlist[i].active=false;
}
//全选为false后把数据放在浏览器里面把key值设置为cartList
localStorage.setItem('cartList', JSON.stringify(this.cartlist));
}
},
ziCheck(){
//当多选框变化时把数据放在浏览器里面把key值设置为cartList
localStorage.setItem('cartList', JSON.stringify(this.cartlist));
},
},
computed:{
//计算购物车商品总和
activeNum(){
let activeProductList=this.cartlist.filter(item=>{
return item.active
})
return activeProductList.length;
},
//计算购物车商品的总价格
totalPrice(){
let result=0;
for(pro of this.cartlist){
if(pro.active){
result=result+pro.productPrice*pro.productNum
}
}
return result
}
},
updated() {
//当多选框都为true全选后的多选框为true
var isActive=this.cartlist.every(c => c.active)
if (isActive) {
document.getElementById("isCheck").checked=true
} else {
document.getElementById("isCheck").checked=false
}
},
}
let app=new Vue({
el:"#app",
data() {
return {
productName:'',
productPrice:'',
productList:[],
cartList:[]
}
},
methods: {
addProduct(){
let isnameOk=true;
let ispriceOk=true;
if (this.productName=="") {
isnameOk=false
}
if(isNaN(this.productPrice) || this.productPrice<=0){
ispriceOk=false;
}
if(isnameOk && ispriceOk){
//查找新增的商品是否存在商品列表中,如果不存在返回-1
let findindex=this.productList.findIndex(item=>{
return item.productName==this.productName
})
//判断商品列表中是否存在新增的商品
if(findindex==-1){
//把新商品添加到商品列表中
this.productList.push({productName:this.productName,productPrice:this.productPrice})
//把数据放在浏览器里面把key值设置为productList
localStorage.setItem('productList', JSON.stringify(this.productList));
//添加完表单中的输入框调为空
this.productName='';
this.productPrice='';
}else{
alert("此商品已经存在商品列表!")//商品已存在,给出提示
}
}else{
alert("请输入合适的商品名称及单价")
}
},
addProToCart(index){
let newproduct=this.productList[index];//根据下标从商品列表里面取出商品
//从购物车列表中查找,是否存在新的商品,如果找到返回购物车的商品
let product= this.cartList.find(item=>{
return item.productName==newproduct.productName
})
if (product) {
//如果有对应的商品则数量加一
product.productNum++
}else{
//没有对应的商品就添加商品到购物车
this.cartList.push({
productName:newproduct.productName,
productPrice:newproduct.productPrice,
productNum:1,
active:true
})
//把数据放在浏览器里面把key值设置为cartList
localStorage.setItem('cartList', JSON.stringify(this.cartList));
}
},
deleteProToCart(index){
let isOk=confirm("是否删除此商品!")
if(isOk){
this.productList.splice(index,1)
}
//把数据放在浏览器里面把key值设置为productList
localStorage.setItem('productList', JSON.stringify(this.productList));
}
},
//生命周期钩子,部署完后执行从浏览器中把数据拿出来
mounted(){
for(pro of JSON.parse(localStorage.getItem("productList"))){
this.productList.push({productName:pro.productName,productPrice:pro.productPrice});
}
for(pro of JSON.parse(localStorage.getItem("cartList"))){
this.cartList.push({productName:pro.productName,productPrice:pro.productPrice,productNum:pro.productNum,active:pro.active});
}
},
components:{
cart
},
})
</script>
</html>