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="../vue.js"></script>
    <style>
        li{
            display: flex;
            justify-content: space-around;
            padding: 10px;
        }
        li img{
            width: 100px;
        }

    </style>
</head>
<body>
    <div id="box">
        <div v-if="list.length===0">购物车空空如也</div>
        <template v-else>
            <input type="checkbox" @change="handleAllChecked" v-model="isAllChecked"/>全选/全不选
            <ul>
                <li v-for="(item,index) in list" :key="item.id">
                    <input type="checkbox" v-model="checkGroup" :value="item" @change="checked()"/>
                    <img :src="item.pic" alt="">
                    <div>
                        <div>名称:{{item.name}}</div>
                        <div>价格:¥{{item.price}}</div>
                    </div>
                    <div>
                        <button @click="item.number--" :disabled="item.number===1">-</button>
                        {{item.number}}
                        <button @click ="item.number++" :disabled="item.number===item.limit">+</button>
                    </div>
                    <div>
                        <button @click="handleDelete(index,item.id)">删除</button>
                    </div>
                </li>
            </ul>
            <div style="background-color: yellow;">
                总金额:¥{{sum()}}
            </div>
        </template>
    </div>
    <script>
        new Vue({
            el:'#box',
            data:{
                list:[
                    {
                        name:'商品1',
                        price:34,
                        number:9,
                        id:1,
                        limit:15,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品2',
                        price:65,
                        number:2,
                        id:2,
                        limit:3,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品3',
                        price:23,
                        number:12,
                        id:3,
                        limit:15,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品4',
                        price:72,
                        number:10,
                        id:4,
                        limit:13,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                ],
                checkGroup:[],
                isAllChecked:false,
            },
            methods:{
                // 计算总金额
                sum(){
                    var total=0
                    this.checkGroup.forEach(item => {
                        total+=item.price*item.number
                    });
                    return total
                },
                // 删除
                handleDelete(index,deleteId){
                    // 删除checkGroup数组的对应的元素
                    this.checkGroup=this.checkGroup.filter(item=>item.id!=deleteId)
                    // 删除原数组
                    this.list.splice(index,1)
                    // 判断全选是否勾上
                    this.checked()
                },
                // 全选
                handleAllChecked(ev){
                    // console.log('checked==',ev.target.checked);
                    if(this.isAllChecked){
                        this.checkGroup=this.list
                    }else{
                        this.checkGroup=[]
                    }
                },
                // 判定是否全选
                checked(){
                    if(this.checkGroup.length===this.list.length){
                        this.isAllChecked=true
                    }else{
                        this.isAllChecked=false
                    }
                }
            }
        })
    </script>
</body>
</html>

=======================================
通过计算属性实现全选

<!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="../vue.js"></script>
    <style>
        li{
            display: flex;
            justify-content: space-around;
            padding: 10px;
        }
        li img{
            width: 100px;
        }

    </style>
</head>
<body>
    <div id="box">
        <div v-if="list.length===0">购物车空空如也</div>
        <template v-else>
            <input type="checkbox" v-model="isAllCheckedComputed"/>全选/全不选
            <ul>
                <li v-for="(item,index) in list" :key="item.id">
                    <input type="checkbox" v-model="checkGroup" :value="item"/>
                    <img :src="item.pic" alt="">
                    <div>
                        <div>名称:{{item.name}}</div>
                        <div>价格:¥{{item.price}}</div>
                    </div>
                    <div>
                        <button @click="item.number--" :disabled="item.number===1">-</button>
                        {{item.number}}
                        <button @click ="item.number++" :disabled="item.number===item.limit">+</button>
                    </div>
                    <div>
                        <button @click="handleDelete(index,item.id)">删除</button>
                    </div>
                </li>
            </ul>
            <div style="background-color: yellow;">
                总金额:¥{{sum()}}
            </div>
        </template>
    </div>
    <script>
        new Vue({
            el:'#box',
            data:{
                list:[
                    {
                        name:'商品1',
                        price:34,
                        number:9,
                        id:1,
                        limit:15,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品2',
                        price:65,
                        number:2,
                        id:2,
                        limit:3,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品3',
                        price:23,
                        number:12,
                        id:3,
                        limit:15,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品4',
                        price:72,
                        number:10,
                        id:4,
                        limit:13,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                ],
                checkGroup:[],
                isAllChecked:false,
            },
            methods:{
                // 计算总金额
                sum(){
                    var total=0
                    this.checkGroup.forEach(item => {
                        total+=item.price*item.number
                    });
                    return total
                },
                // 删除
                handleDelete(index,deleteId){
                    // 删除checkGroup数组的对应的元素
                    this.checkGroup=this.checkGroup.filter(item=>item.id!=deleteId)
                    // 删除原数组
                    this.list.splice(index,1)
                    // 判断全选是否勾上
                    this.checked()
                },
               
            },
            computed:{
                isAllCheckedComputed:{
                    set(isChecked){
                        if(isChecked){
                            this.checkGroup=this.list
                        }else{
                            this.checkGroup=[]
                        }
                    },
                    get(){
                        return this.checkGroup.length===this.list.length
                    }
                }
            }
        })
    </script>
</body>
</html>

=====================================
通过watch属性实现全选

<!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="../vue.js"></script>
    <style>
        li{
            display: flex;
            justify-content: space-around;
            padding: 10px;
        }
        li img{
            width: 100px;
        }

    </style>
</head>
<body>
    <div id="box">
        <div v-if="list.length===0">购物车空空如也</div>
        <template v-else>
            <input type="checkbox" v-model="isAllChecked"/>全选/全不选
            <ul>
                <li v-for="(item,index) in list" :key="item.id">
                    <input type="checkbox" v-model="checkGroup" :value="item" @change="checked()"/>
                    <img :src="item.pic" alt="">
                    <div>
                        <div>名称:{{item.name}}</div>
                        <div>价格:¥{{item.price}}</div>
                    </div>
                    <div>
                        <button @click="item.number--" :disabled="item.number===1">-</button>
                        {{item.number}}
                        <button @click ="item.number++" :disabled="item.number===item.limit">+</button>
                    </div>
                    <div>
                        <button @click="handleDelete(index,item.id)">删除</button>
                    </div>
                </li>
            </ul>
            <div style="background-color: yellow;">
                总金额:¥{{sum()}}
            </div>
        </template>
    </div>
    <script>
        new Vue({
            el:'#box',
            data:{
                list:[
                    {
                        name:'商品1',
                        price:34,
                        number:9,
                        id:1,
                        limit:15,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品2',
                        price:65,
                        number:2,
                        id:2,
                        limit:3,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品3',
                        price:23,
                        number:12,
                        id:3,
                        limit:15,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                    {
                        name:'商品4',
                        price:72,
                        number:10,
                        id:4,
                        limit:13,
                        pic:'https://www.omekanko.gr.jp/wph8gq9w/wp-content/uploads/2019/03/P7303834.jpg'
                    },
                ],
                checkGroup:[],
                isAllChecked:false,
            },
            methods:{
                // 计算总金额
                sum(){
                    var total=0
                    this.checkGroup.forEach(item => {
                        total+=item.price*item.number
                    });
                    return total
                },
                // 删除
                handleDelete(index,deleteId){
                    // 删除checkGroup数组的对应的元素
                    this.checkGroup=this.checkGroup.filter(item=>item.id!=deleteId)
                    // 删除原数组
                    this.list.splice(index,1)
                    // 判断全选是否勾上
                    this.checked()
                },
                // 判定是否全选
                checked(){
                    if(this.checkGroup.length===this.list.length){
                        this.isAllChecked=true
                    }else{
                        this.isAllChecked=false
                    }
                }
            },
            watch:{
                // 监听状态改变
                isAllChecked(data){
                    if(this.isAllChecked){
                        this.checkGroup=this.list
                    }else{
                        if(this.checkGroup.length===this.list.length){
                            this.checkGroup=[]
                        }
                    }
                }
            }
        })
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中,可以使用 `v-model` 指令绑定数据,通过 `v-for` 指令循环渲染出购物车列表中每个商品的复选框。可以用一个变量 `checkedAll` 来记录是否全选,当其中一个复选框被选中或取消选中时,都要检查是否所有的复选框都被选中,以确定是否需要将 `checkedAll` 设置为 `true` 或 `false`。当点击全选按钮时,则将所有复选框的状态设置为 `checkedAll`。 以下是一个简单的实现示例: ```html <template> <div> <div> <input type="checkbox" v-model="checkedAll" @change="checkAll"> <label>全选</label> </div> <div v-for="(item, index) in cartList" :key="index"> <input type="checkbox" v-model="item.checked" @change="checkOne"> <label>{{ item.name }}</label> </div> </div> </template> <script> export default { data() { return { cartList: [ { name: '商品1', checked: false }, { name: '商品2', checked: false }, { name: '商品3', checked: false } ], checkedAll: false } }, methods: { checkAll() { for (let i = 0; i < this.cartList.length; i++) { this.cartList[i].checked = this.checkedAll } }, checkOne() { let allChecked = true for (let i = 0; i < this.cartList.length; i++) { if (!this.cartList[i].checked) { allChecked = false break } } this.checkedAll = allChecked } } } </script> ``` 在上面的代码中,`cartList` 是一个包含商品信息的数组,每个商品都有一个 `checked` 属性记录是否被选中。在 `checkAll` 方法中,遍历 `cartList` 将每个商品的 `checked` 属性设置为 `checkedAll`。在 `checkOne` 方法中,检查是否所有的商品都被选中,然后将结果赋给 `checkedAll`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值