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从入门到精通(视频教学版)》,获出版社和作者授权发布。

相关推荐
她似晚风般温柔7892 小时前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
Jiaberrr3 小时前
前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)
前端·javascript·vue.js·微信小程序·uni-app
everyStudy3 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
城南云小白3 小时前
web基础+http协议+httpd详细配置
前端·网络协议·http
前端小趴菜、3 小时前
Web Worker 简单使用
前端
web_learning_3213 小时前
信息收集常用指令
前端·搜索引擎
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
tabzzz3 小时前
Webpack 概念速通:从入门到掌握构建工具的精髓
前端·webpack
LvManBa4 小时前
Vue学习记录之六(组件实战及BEM框架了解)
vue.js·学习·rust
200不是二百4 小时前
Vuex详解
前端·javascript·vue.js