发布时间:2023-04-21 文章分类:WEB开发, 电脑百科 投稿人:王小丽 字号: 默认 | | 超大 打印

Vue实现简易购物车功能

代码:

<!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>Document</title>
    <script src="./lib/vue.global.js"></script>
    <style>
        li{
            display: flex;
            /* width: 500px; */
            justify-content: space-around;
            margin-top: 20px;
        }
        li img{
            width: 100px;
        }
    </style>
</head>
<body>
    <div id="box">
        <input type="checkbox" v-model="isAll" @change="handleAllCheck()">全选/全不选
        <ul>
            <li v-for="(item,index) in datalist" :key="item.id">
                <input type="checkbox" v-model="checkList" :value="item" @change="handleItemCkecked">
                <img :src="item.pic">
                <div>
                    <div>商品:{{item.name}}</div>
                    <div style="color: red;">价格:{{item.price}}</div>
                </div>
                <div>
                    <button @click="item.number--" :disabled="item.number===1">-</button>
                    <span>{{item.number}}</span>
                    <button @click="item.number++" :disabled="item.number===item.limit">+</button>
                </div>
                <div>
                    <button @click="handleDelete(index,item.id)">删除</button>
                </div>
            </li>
        </ul>
        <div>总金额:{{ computedSum }}</div>
        {{checkList}}
    </div>
    <script>
        var obj={
            data(){
                return {
                    isAll:false,
                    checkList:[],//勾选的购物车数据
                    datalist:[
                        {
                            name:"商品1",
                            price:10,
                            number:1,
                            id:1,
                            limit:5,//限购
                            pic:"https://www.yuucn.com/wp-content/uploads/2023/04/1682073083-687857a0d8c1fc9.jpg"
                        },
                        {
                            name:"商品2",
                            price:20,
                            number:2,
                            id:2,
                            limit:10,//限购
                            pic:"https://www.yuucn.com/wp-content/uploads/2023/04/1682073083-687857a0d8c1fc9.jpg"
                        },
                        {
                            name:"商品3",
                            price:30,
                            number:3,
                            id:3,
                            limit:15,//限购
                            pic:"https://www.yuucn.com/wp-content/uploads/2023/04/1682073083-687857a0d8c1fc9.jpg"
                        }
                    ]
                }
            },
            methods:{
                handleDelete(index,id){
                    // console.log(index)
                    //删除datalist-靠index
                    this.datalist.splice(index,1)
                    //删除checkList-靠id
                    this.checkList = this.checkList.filter(item => item.id!=id)
                    //同步一下状态
                    this.handleItemCkecked()
                },
                handleAllCheck(){
                    if(this.isAll){
                        this.checkList=this.datalist//全选
                    }else{
                        this.checkList=[]//全不选
                    }
                },
                handleItemCkecked(){
                    if(this.checkList.length===this.datalist.length){
                        // console.log("全选")
                        this.isAll = true
                    }else{
                        // console.log("全不选")
                        this.isAll = false
                    }
                }
            }
            computed:{
                computedSum(){
                    //累加计算 checkList每一项的价格*数量
                    var total=0
                    this.checkList.forEach(item => {
                        total+=item.price*item.number
                    });
                    return total
                }
            }
        }
        Vue.createApp(obj).mount("#box")
    </script>
</body>
</html>

结果:

Vue实现简易购物车功能

功能实现:

(1)勾选了哪一个,就显示这个数据信息,然后累加计算勾选的数据对象里的“价格*数量”:

Vue实现简易购物车功能

Vue实现简易购物车功能

Vue实现简易购物车功能

Vue实现简易购物车功能

注意点解释:

Vue实现简易购物车功能

(2)商品数量的选购:直接把表达式放在点击事件后面,调整数量的选购

Vue实现简易购物车功能

注意点解释:

(3)删除购物车的商品

Vue实现简易购物车功能

Vue实现简易购物车功能

Vue实现简易购物车功能

(4)全选全不选:

Vue实现简易购物车功能

Vue实现简易购物车功能

Vue实现简易购物车功能

(5)通过每一项的选择来控制全选全不选 

Vue实现简易购物车功能

Vue实现简易购物车功能

(6)解决一个小问题

我刚开始没有选择所有的商品,只选了几个,所以那个全选的按钮就不会被选中,但是当我删除了几个没有选择的商品,留下全部选中的商品,但是这个时候全选框还是false值,(原因是我们是把事件绑在了当每项input的value改变的时候才触发,而我们删除input是不涉及value的改变的,)这个时候我们就在删除的函数里重新调用一下这个方法就行了。

Vue实现简易购物车功能