Vue3使用组件的计算属性设计购物车效果

Vue.js3组件的方法-CSDN博客

使用Vue3组件的计算属性-CSDN博客

Vue3组件计算属性的get和set方法-CSDN博客

Vue3组件计算属性的缓存-CSDN博客

Vue3使用组件的计算属性代替v-for和v-if-CSDN博客

商城网站中经常需要设计购物车效果。购物车页面中会显示商品名称、商品单价、商品数量、单项商品的合计价格,最后会有一个购物车中所有商品的总价。
【例3.17】 使用计算属性设计购物车效果(源代码\ch03\3.17.html)。

<div id="app">
    <div>
        <div>
            <h3 align="center">商品购物车</h3>
        </div>
        <div>
            <div>
                <label>
                    <input type="checkbox" v-model="checkAll">
                    全选
                </label>
                <label>
                    <input type="checkbox" v-model="checkNo">
                    反选
                </label>
            </div>
            <ul>
                <li v-for="(item,index) in list" :key="item.id">
                    <div>
                        <label>
                            <input type="checkbox" v-model="item.checked">
                            {{item.name}}
                        </label>
                        ¥ {{item.price}}
                        &nbsp;&nbsp;&nbsp;&nbsp;
                        <button type="button"  @click="item.nums>1? item.nums-=1:1">-</button>
                        数量:{{item.nums}}
                        <button type="button"  @click="item.nums+=1">+ </button>
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        小计:{{item.nums*item.price}}
                    </div>
                 </li>
            </ul>
            <p align="right">总价:{{sumPrice}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<button type="button"  @click="save" >提交订单</button></p>
        </div>
    </div>
</div>
<!--引入Vue文件-->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
    //创建一个应用程序实例
    const vm= Vue.createApp({
        //该函数返回数据对象
        data(){
          return{
             list: [{
                        id: 1,
                        name: '洗衣机',
                        checked: true,
                        price: 6800,
                        nums: 1,
                    },
                    {
                        id: 2,
                        name: '电视机',
                        checked: true,
                        price: 4900,
                        nums: 1,
                    },
                    {
                        id: 3,
                        name: '饮水机',
                        checked: true,
                        price: 1000,
                        nums: 3,
                    },
                ],
            }
           },
        computed: {
                    //全选
                checkAll: {
                    // 设置值,当勾先"全选"按钮的时候触发
                    set(v) {
                        this.list.forEach(item => {
                            item.checked = v
                        });
                    },
                    // 取值,当列表中的选择改变之后触发
                    get() {
                        return this.list.length === this.list.filter(item => item.checked == true).length;
                    },
                },
                //反选
                checkNo: {
                    set() {
                        this.list.forEach(item => {
                            item.checked = !item.checked;
                        });
                    },
                    get() {
                        // return this.list.length === this.list.filter(item => item.checked == true).length;
                    },
                },
                // 总价计算
                sumPrice() {
                    return this.list
                        .filter(item => item.checked)
                        /* reduce*******************************
                        arr.reduce(function (prev, cur, index, arr) {
                            ...
                        }, init);
                        arr 表示原数组;
                        prev 表示上一次调用回调时的返回值,或者初始值 init;
                        cur 表示当前正在处理的数组元素;
                        index 表示当前正在处理的数组元素的索引,若提供init值,则索引为0,否则索引为1;
                        init表示初始值。
                        常用的参数只有两个:prev和cur,求数组项之和
                        var sum = arr.reduce(function (prev, cur) {
                            return prev + cur;
                        }, 0); */
                        .reduce((pre, cur) => {
                            return pre + cur.nums * cur.price;
                        }, 0);
                },
            },
            methods: {
                save() {
                    console.log(this.list.filter(item =>
                        item.checked
                    ));
                }
            },
    //在指定的DOM元素上装载应用程序实例的根组件
    }).mount('#app');
</script>

在Chrome浏览器中运行程序,选择不同的商品,并设置商品的数量后,结果如图3-20 所示。

本文节选自《Vue.js 3.x+Element Plus从入门到精通(视频教学版)》,获出版社和作者授权发布。

相关推荐
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie1 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic2 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿2 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具3 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
清灵xmf3 小时前
TypeScript 类型进阶指南
javascript·typescript·泛型·t·infer
小白学大数据3 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
qq_390161773 小时前
防抖函数--应用场景及示例
前端·javascript
334554324 小时前
element动态表头合并表格
开发语言·javascript·ecmascript