鍍金池/ 問(wèn)答/Java  PHP  Python  HTML/ 關(guān)于vue中的watch屬性的請(qǐng)教,如下圖和代碼

關(guān)于vue中的watch屬性的請(qǐng)教,如下圖和代碼

問(wèn)題

1.想要藍(lán)色框中的checkbox都是選中狀態(tài)的時(shí)候,紅色框中顯示為true
2.已經(jīng)通過(guò)methods實(shí)現(xiàn)
3.請(qǐng)問(wèn)用watch如何實(shí)現(xiàn)

clipboard.png

代碼

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue 測(cè)試實(shí)例 - 菜鳥(niǎo)教程(runoob.com)</title>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
    <style>
        * {
            padding: 0;
            margin: 0;
        }
        
        .app-cart {
            padding-bottom: 100px;
            background-color: #f5f5f5;
        }
        
        .app-cart .cart-header {
            height: 40px;
            line-height: 40px;
            text-align: center;
            border-bottom: 1px solid #ccc;
        }
        
        .cart-main .main-item {
            margin-bottom: 10px;
            background-color: #fff;
            box-sizing: border-box;
            border-top: 1px solid #ccc;
            border-bottom: 1px solid #ccc;
        }
        
        .cart-main .main-item .item-top {
            display: flex;
            align-items: center;
            height: 40px;
            box-sizing: border-box;
            border-bottom: 1px solid #ccc;
        }
        
        .cart-main .main-item .item-top input {
            flex: 0 0 50px;
            width: 50px;
        }
        
        .cart-main .main-item .item-top span {
            flex: 1;
        }
        
        .cart-main .main-item .item-middle .middle-list {
            display: flex;
            box-sizing: border-box;
            border-bottom: 1px solid #ccc;
        }
        
        .cart-main .main-item .item-middle .middle-list .list-left {
            flex: 0 0 50px;
            width: 50px;
            text-align: center;
        }
        
        .cart-main .main-item .item-middle .middle-list .list-center {
            flex: 0 0 100px;
            width: 100px;
        }
        
        .cart-main .main-item .item-middle .middle-list .list-right {
            display: flex;
            flex-direction: column;
            flex: 1;
        }
        
        .cart-main .main-item .item-footer {
            display: flex;
            align-items: center;
            justify-content: space-between;
            height: 40px;
            border-top: 1px solid #ccc;
        }
        
        .cart-footer {
            position: fixed;
            left: 0;
            bottom: 60px;
            width: 100%;
            height: 50px;
            display: flex;
            background-color: #fff;
            box-sizing: border-box;
            border-top: 1px solid #ccc;
        }
        
        .cart-footer .footer-left {
            flex: 0 0 50px;
            width: 50px;
            display: flex;
            align-items: center;
            margin-left: 20px;
        }
        
        .cart-footer .footer-center {
            flex: 1;
            text-align: right;
        }
        
        .cart-footer .footer-right {
            flex: 0 0 100px;
            width: 100px;
            background-color: #ff0000;
            color: #fff;
        }
    </style>

</head>

<body>
    <div id="app">
        <div class="app-cart">
            <header class="cart-header">購(gòu)物車(chē)</header>
            <main class="cart-main">
                <div v-for="item1 in cartData" :key="item1.id" class="main-item">
                    <div class="item-top">
                        <input type="checkbox" v-model="item1.checked" @change="selectItem1(item1)">
                        <span>{{item1.shop_name}}</span>
                    </div>
                    <div class="item-middle">
                        <div v-for="(item2,index2) in item1.goodsList" :key="item2.id" class="middle-list">
                            <div class="list-left">
                                <input type="checkbox" @change="selectItem2(item1)" v-model="item2.checked">
                            </div>
                            <div class="list-center">
                                <!-- <img v-lazy="IMAGESURL + item2.goods_img"> -->
                            </div>
                            <div class="list-right">
                                <p>{{item2.goods_name}}</p>
                                <div>
                                    <span>單價(jià):{{item2.goods_price}}</span>
                                    <span>數(shù)量:{{item2.cart_goods_number}}</span>
                                </div>
                                <p>總價(jià):{{item2.goods_price*item2.cart_goods_number}}</p>
                            </div>
                        </div>

                    </div>
                </div>
            </main>
            <footer class="cart-footer">
                <div class="footer-left">
                    <input type="checkbox" v-model="checkAll" @change="selectAll">
                    <p>全選</p>
                </div>
                <div class="footer-center">
                    合計(jì):{{allPrice}}
                </div>
                <div class="footer-right">
                    結(jié)算
                </div>
            </footer>
            <div>watch:{{bb}}</div>
        </div>
    </div>

    <script>
        new Vue({
            el: '#app',
            data() {
                return {
                    bb: "",
                    cartData: [{
                        shop_id: 4,
                        shop_name: "honor之家",
                        checked: false,
                        goodsList: [{
                            cart_goods_number: 3,
                            goods_name: "honor7x",
                            goods_img: "honor7x.png",
                            goods_price: 1299,
                            goods_id: 3,
                            checked: false
                        }, {
                            cart_goods_number: 2,
                            goods_name: "honor6x",
                            goods_img: "honor6x.png",
                            goods_price: 1199,
                            goods_id: 4,
                            checked: false
                        }, {
                            cart_goods_number: 5,
                            goods_name: "honor5x",
                            goods_img: "honor5x.png",
                            goods_price: 1099,
                            goods_id: 5,
                            checked: false
                        }]
                    }, {
                        shop_id: 1,
                        shop_name: "iPhone之家",
                        checked: false,
                        goodsList: [{
                            cart_goods_number: 1,
                            goods_name: "iPhonex",
                            goods_img: "iPhonex.png",
                            goods_price: 8888,
                            goods_id: 1,
                            checked: false
                        }]
                    }],
                    allPrice: 0,
                    checkAll: false
                };
            },
            methods: {
                // 全選
                selectAll() {
                    this.cartData.forEach(item => {
                        item.checked = this.checkAll;
                        item.goodsList.forEach(item => {
                            item.checked = this.checkAll;
                        });
                    });
                    if (this.checkAll == false) {
                        this.allPrice = 0;
                    }
                },
                // 第一層選擇
                selectItem1(item1) {
                    item1.goodsList.forEach(i => {
                        i.checked = item1.checked;
                    });
                },
                // 第二層選擇
                selectItem2(item1) {
                    let item1Price = 0;
                    let lengths = item1.goodsList.length;
                    let checkeds = item1.goodsList.filter(i => {
                        return i.checked == true;
                    });
                    if (lengths == checkeds.length) {
                        item1.checked = true;
                    } else {
                        item1.checked = false;
                    }
                    checkeds.forEach(item => {
                        this.allPrice += item.goods_price * item.cart_goods_number;
                    });
                    
                    //通過(guò)事件來(lái)監(jiān)聽(tīng),如果全部選中為true,否則為false
                    this.bb = this.cartData.every(item1 => {
                        return item1.goodsList.every(item2 => {
                            return item2.checked == true;
                        })
                    })
                },

            },
            watch: {
                bb: function() {
                    this.bb = this.cartData.every(item1 => {
                        return item1.goodsList.every(item2 => {
                            return item2.checked == true;
                        })
                    })
                }
            }
        })
    </script>
</body>

</html>
回答
編輯回答
孤毒

watch

data:{
    cc:''
}
            watch: {
                cartData: {
                    handler(val) {
                        console.log(val)
                        this.cc = val.every(item1 => {
                            return item1.goodsList.every(item2 => {
                                return item2.checked == true
                            })
                        })
                    },
                    deep: true
                }
            },

computed

            computed: {
                cc() {
                    return this.cartData.every(item1 => {
                        return item1.goodsList.every(item2 => {
                            return item2.checked == true
                        })
                    })
                }
            }
2018年4月6日 13:22
編輯回答
愛(ài)礙唉

一個(gè)計(jì)算屬性不就搞定了么

2017年8月1日 11:23
編輯回答
款爺

你應(yīng)該 watch 的是 cartData, 判斷是否為全選中狀態(tài)來(lái)設(shè)置 bb

2017年3月13日 14:01
編輯回答
胭脂淚
watch: {
    cartData: {
        handler: function(val){
            var all_status = [];
            val.forEach( value1 => {
                let status = false
                for(let i = 0; i < value1.goodsList.length; i ++){
                    if(!value1.goodsList[i].checked)
                    break;
                    if(i == value1.goodsList.length -1)
                    status = true
                    else 
                    status = false
                }
                value1.checked = status
                all_status.push(status)
            })
            for(let i = 0; i < all_status.length; i ++){
                if(!all_status[i])
                break;
                if(i == all_status.length -1 )
                this.checkAll = true
            }
        },
        deep: true,
    }
}

親試,可以的


clipboard.png
this.checkAll = true下面多加個(gè)this.bb = true,記得用大括號(hào)把兩行表達(dá)式括起來(lái)。

2017年3月29日 01:01