Vue简单购物车案例

2022-10-03 12:36:55
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>购物车</title></head><body><div id="root"><div>
            商品名称:<input type="text" name="productName" v-model="Newproduce.productName"> 商品价格:<input type="text" name="productPrice" v-model="Newproduce.productPrice"><br><button type="button" @click="addProduct">添加商品</button></div><ul><li v-for="(item,index) in productList":key="index">
                商品名称:{{item.productName}}---商品单价:{{item.productPrice}}<button @click="addToCart(index)">添加到购物车</button></li></ul><Cart:cartlist="cartlist"></Cart></div><!-- 购物车组件--><template id="cart"><div><table border="1"><tr><td>选择<input type="checkbox" @click="allchange" v-model="changeCount"></td><td>商品名称</td><td>商品单价</td><td>商品数量</td><td>价格</td></tr><tr v-for="(item,index) in cartlist":key="index"><td><input type="checkbox" v-model="item.active"></td><td>{{item.paoNam}}</td><td>{{item.proPrice}}</td><td><button type="button" @click="reduceCount(index)">-</button>{{item.proCount}}<button type="button" @click="addCount(index)">+</button></td><td>{{item.proPrice*item.proCount}}</td></tr><tr><td colspan="3">选中的商品:{{checkNum}}/{{this.cartlist.length}}</td><td colspan="2">需付总价格:{{totalprice}}</td></tr></table></div></template></body><script src="../js/vue.js"></script><script>// type: Boolean,//  default: true// 购物车子组件var Cart={
        template:'#cart',// 接受来自父组件的数据
        props:['cartlist'],data(){return{
                changeCount:true}},
        methods:{reduceCount(index){let pro=this.cartlist[index];if(pro.proCount>1){
                    pro.proCount--;}else{this.cartlist.splice(index,1);}},addCount(index){this.cartlist[index].proCount++;},allchange(){// var change = this.cartlist.every(item => item.active)// if (!change) {//     changeCount = false// }//若标识为true,则让所有商品不全选if(this.isAllSelect){this.cartlist.forEach((item)=>(item.active=false));}else{//若标识为false,则让所有商品全选this.cartlist.forEach((item)=>(item.active=true));}},},
        computed:{//返回被选中的商品列表selectList(){returnthis.cartlist.filter((item)=> item.active);},//动态判断是否全选isAllSelect(){returnthis.cartlist.length===this.selectList.length;},// 选中的商品数量checkNum(){// let checkProList = this.cartlist.filter(item => {//     return item.active;// })returnthis.selectList.length;},// 计算总金额totalprice(){let checkProList=this.cartlist.filter(item=>{return item.active;})let sum=0;for(proof checkProList){
                    sum+= pro.proPrice* pro.proCount;}return sum},},updated(){if(this.isAllSelect)this.changeCount=true;elsethis.changeCount=false;},}var root=newVue({
        el:'#root',
        components:{
            Cart},data(){return{// 新增商品属性
                Newproduce:{
                    productName:'',
                    productPrice:0,},// 商品列表
                productList:[{
                    productName:'小酥肉',
                    productPrice:10},{
                    productName:'炸鸡柳',
                    productPrice:15},{
                    productName:'酱烧鸡',
                    productPrice:50},],
                cartlist:[{
                    active:true,
                    paoNam:'酸辣粉',
                    proPrice:8,
                    proCount:5,
                    proSum:40},{
                    active:true,
                    paoNam:'麻辣烫',
                    proPrice:15,
                    proCount:2,},{
                    active:true,
                    paoNam:'臭豆腐',
                    proPrice:10,
                    proCount:3,},]}},
        methods:{// 添加商品addProduct(){if(this.Newproduce.productName==''){alert('名称不能为空');return;}elseif(this.Newproduce.productPrice<0){alert('商品单价不合理');return;}// 判断商品列表中是否已存在新的商品const pros=this.productList.filter(item=>{return item.productName==this.Newproduce.productName})if(pros.length>0){alert('该商品已存在');return}else{// 添加商品,对于复杂数据烈性添加到数组的情况,注意要复制对象
                    console.log('添加商品成功');this.productList.push({
                        productName:this.Newproduce.productName,
                        productPrice:this.Newproduce.productPrice})this.Newproduce.productName='';this.Newproduce.productPrice='';}},//    添加购物车addToCart(index){// addPro 要添加的商品数据let addPro=this.productList[index];// pro购物车中的商品let pro=this.cartlist.find(item=> item.paoNam== addPro.productName)// 购物车中已经存在此商品if(pro) pro.proCount++;else{this.cartlist.push({
                        active:true,
                        paoNam: addPro.productName,
                        proPrice: addPro.productPrice,
                        proCount:1,})}},// 全选状态allchange(){// return this.list.every((item) => item.goods_state);returnthis.cartlist.every((item)=> item.active)},},
        watch:{productList(){
                window.localStorage.setItem("productList",JSON.stringify(this.productList))}},created(){if(window.localStorage.getItem('productList')){let proList=JSON.parse(window.localStorage.getItem("productList"));this.productList= proList;}},})</script></html>

运行效果
在这里插入图片描述

  • 作者:前端踩坑实录
  • 原文链接:https://blog.csdn.net/qq_45677631/article/details/121739488
    更新时间:2022-10-03 12:36:55