【vue】购物车案例优化

对 购物车案例 进行优化

  • watch实现全选/取消全选
  • watch实现全选状态的检查
  • computed计算总价格

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <table>
            <thead>
                <tr>
                    <!-- 全选 -->
                    <!-- <td><input type="checkbox" @click="selectAll" v-model="data.selected"></td> -->
                    <td><input type="checkbox" v-model="data.selected"></td>

                    <td>商品名称</td>
                    <td>商品价格</td>
                    <td>库存</td>
                    <!-- colspan2: 单元格跨度为2 -->
                    <td colspan="2">操作</td>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(item, index) in data.list" :key="item.id">
                    <td>
                        <!-- <input type="checkbox" :value="item" v-model="data.checkboxList" @change="checkSelect"> -->
                        <input type="checkbox" :value="item" v-model="data.checkboxList">
                    </td>
                    <td>{{item.name}}</td>
                    <td>{{item.price}}</td>
                    <td>{{item.stock}}</td>
                    <td>
                        <button @click="sub(item)">-</button>
                        {{item.number}}
                        <button @click="add(item)">+</button>
                    </td>
                    <td>
                        <button @click="del(index,item.id)">删除</button>
                    </td>
                </tr>

            </tbody>
            <tfoot>
                <tr>
                    <td>总价格: {{totalPrice}}</td>
                </tr>
            </tfoot>
        </table>
    </div>

    <script type="module">
        import { createApp, reactive, ref, watch, computed } from './vue.esm-browser.js'
        createApp({
            setup() {
                const data = reactive({
                    selected: false,//全选?
                    checkboxList: [],//购物车中的商品
                    list: [{
                        id: 1,//编号
                        name: '洗衣机',//名字
                        price: 10000,//价格
                        number: 1,//数量
                        stock: 10//库存
                    },
                    {
                        id: 2,
                        name: '电冰箱',
                        price: 20000,
                        number: 2,
                        stock: 8
                    },
                    {
                        id: 3,
                        name: '空调',
                        price: 30000,
                        number: 3,
                        stock: 6
                    },
                    {
                        id: 4,
                        name: '电视',
                        price: 40000,
                        number: 4,
                        stock: 4
                    },
                    {
                        id: 5,
                        name: '微波炉',
                        price: 50000,
                        number: 5,
                        stock: 20
                    }
                    ]
                })
                // //全选/反选
                // const selectAll = () => {
                //     data.selected = !data.selected
                //     if (data.selected) {//全选
                //         data.checkboxList = data.list
                //     }
                //     else {//反选
                //         data.checkboxList = []
                //     }
                // }
                // //取消一个物品时候,自动取消全选
                // const checkSelect = () => {
                //     if (data.checkboxList.length == data.list.length && data.list.length != 0) {
                //         data.selected = true
                //     }
                //     else {
                //         data.selected = false
                //     }
                // }
                let flag = true
                //全选/反选
                watch(() => data.selected, (newValue, oldValue) => {
                    console.log(newValue, oldValue)
                    if (newValue) {//全选
                        data.checkboxList = data.list
                    }
                    else {//反选
                        if (flag) {
                            data.checkboxList = []
                        }

                    }
                })
                //全选检查
                watch(() => data.checkboxList, (newValue, oldValue) => {
                    console.log(newValue, oldValue)
                    console.log(newValue.length)
                    if (newValue.length == data.list.length && data.list.length != 0) {
                        data.selected = true
                        flag = true
                    }
                    else {
                        data.selected = false
                        flag = false
                    }
                })
                //计算总价格
                // const totalPrice = () => {
                //     let total = 0
                //     for (let i = 0; i < data.checkboxList.length; i++) {
                //         total += data.checkboxList[i].price * data.checkboxList[i].number
                //     }
                //     return total
                // }
                //计算总价格
                const totalPrice = computed(() => {
                    let total = 0
                    for (let i = 0; i < data.checkboxList.length; i++) {
                        total += data.checkboxList[i].price * data.checkboxList[i].number
                    }
                    return total
                })
                //增加物品数量
                const sub = (value) => {
                    value.number--
                    if (value.number < 1) {
                        value.number = 1
                    }
                }
                //减少物品数量
                const add = (value) => {
                    value.number++
                    if (value.number > value.stock) {
                        value.number = value.stock
                    }
                }
                //删除物品
                const del = (index, id) => {
                    data.list.splice(index, 1)
                    //过滤器:筛选元素,返回新的数组
                    let newArr = data.checkboxList.filter((value, index) => {
                        return value.id != id//删除id相同的元素
                    })
                    data.checkboxList = newArr
                }
                return {
                    data,
                    // selectAll,
                    // checkSelect,
                    totalPrice,
                    sub,
                    add,
                    del
                }
            }
        }).mount("#app")
    </script>
</body>

</html>

参考

https://www.bilibili.com/video/BV1nV411Q7RX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/538904.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper的集群搭建和ZAB协议详解

Zookeeper的集群搭建 1&#xff09;zk集群中的角色 Zookeeper集群中的节点有三个角色&#xff1a; Leader&#xff1a;处理集群的所有事务请求&#xff0c;集群中只有一个LeaderFollwoer&#xff1a;只能处理读请求&#xff0c;参与Leader选举Observer&#xff1a;只能处理读…

HashMap部分底层源码解析

哈希表的物理结构 HashMap底层都是哈希表&#xff08;也称散列表&#xff09;&#xff0c;线程不安全&#xff0c;其中维护了一个长度为2的幂次方的Entry类型的数组table&#xff0c;数组的每一个索引位置被称为一个桶(bucket)&#xff0c;你添加的映射关系(key,value)最终都被…

clickhouse深入浅出

基础知识原理 极致压缩率 极速查询性能 列式数据库管理 &#xff0c;读请求多 大批次更新或无更新 读很多但用很少 大量的列 列的值小数值/短字符串 一致性要求低 DBMS&#xff1a;动态创建/修改/删除库 表 视图&#xff0c;动态查/增/修/删&#xff0c;用户粒度设库…

Go——Goroutine介绍

一. 并发介绍 进程和线程 进程是程序在操作系统中一次执行过程&#xff0c;系统进程资源分配和调度的一个独立单位。线程是进程执行的实体&#xff0c;是CPU调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基本单位。一个进程可以创建和撤销多个线程&#xff0c…

sysbench MySQL性能测试

目录 1. QPS&&TPS 1.1 数据库启动到现在的运行时间(秒) 1.2 查询量 1.3 status命令直接显示出QPS 1.4 每秒输出数据库状态(累加) 2. sysbench 测试工具 3. OLTP MySQL测试 3.1 普通参数 3.2 支持的lua脚本 3.3 脚本参数 3.4 测试数据准备 3.5 进行测试 3.…

硬件18、PCB中元器件旋转

器件旋转45度&#xff0c;如果只是用空格的话&#xff0c;器件只能旋转90度 不要用x和y&#xff0c;因为那是器件的镜像&#xff0c;但是实际器件没有镜像&#xff0c;就会导致焊接失败的问题

FPGA - 以太网UDP通信(三)

一&#xff0c;引言 前文链接&#xff1a;FPGA - 以太网UDP通信&#xff08;一&#xff09; FPGA - 以太网UDP通信&#xff08;二&#xff09; 在以上文章中介绍了以太网简介&#xff0c;以太网UDP通信硬件结构&#xff0c;以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c…

云架构(四)异步请求-应答模式

Asynchronous Request-Reply pattern - Azure Architecture Center | Microsoft Learn 把后台处理和前端解耦&#xff0c;后台处理需要异步处理&#xff0c;但是也需要给前端一个清晰的回应。 背景和问题 在现代应用开发中&#xff0c;代码通常在浏览器中运行&#xff0c;依…

HarmonyOS实战开发-录音机、如何实现音频录制和播放的功能

介绍 本示例使用audio相关接口实现音频录制和播放的功能&#xff0c;使用mediaLibrary实现音频文件的管理。 相关概念&#xff1a; AudioRecorder&#xff1a;音频录制的主要工作是捕获音频信号&#xff0c;完成音频编码并保存到文件中&#xff0c;帮助开发者轻松实现音频录…

麒麟 V10 离线 安装 k8s 和kuboard

目录 安装文件准备 主机准备 主机配置 修改主机名&#xff08;三个节点分别执行&#xff09; 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包&#xff08;所有节点&#xff09; 系统参数设置(所有节点) 时间同步…

【Qt】界面优化

目录 一、QSS 1.1 基本语法 1.2 QSS设置方法 1.2.1 指定控件样式设置 1.2.2 全局样式设置 1.2.3 从文件加载样式表 1.2.4 使用Qt Designer编辑样式 1.3 选择器 1.3.1 介绍 1.3.2 子控件选择器 1.3.3 伪类选择器 1.4 样式属性(盒模型) 1.5 代码示例(登录界面) 二、…

html中的“居中”问题详解(超全)

html中的“居中”问题详解&#xff08;超全&#xff09; 图片居中文本居中定位居中元素居中响应式设计中的居中技巧 引言&#xff1a; 在网页设计和开发中&#xff0c;实现元素的居中是一个常见但也常被低估的挑战。无论是在传统的网页布局中还是在响应式设计中&#xff0c;居中…

DP10RF001一款工作于200MHz~960MHz低功耗、高性能、单片集成的(G)FSK/OOK无线收发芯片

产品概述. DP10RF001是一款工作于200MHz~960MHz范围内的低功耗、高性能、单片集成的(G)FSK/OOK无线收发机芯片。内部集成完整的射频接收机、射频发射机、频率综合器、调制解调器&#xff0c;只需配备简单、低成本的外围器件就可以获得良好的收发性能。芯片支持灵活可设的数据包…

MySQL之sql性能分析

sql执行频率 MySQL客户端连接成功后&#xff0c;通过show[session|global]status命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的所有INSERT、DELETE、UPDATE、SELECT的访问频次。 慢日志查询 慢查询日志记录了所有执行时间超过指定参数(longquer…

AR地图导览小程序是怎么开发出来的?

在移动互联网时代&#xff0c;AR技术的发展为地图导览提供了全新的可能性。AR地图导览小程序结合了虚拟现实技术和地图导航功能&#xff0c;为用户提供了更加沉浸式、直观的导览体验。本文将从专业性和思考深度两个方面&#xff0c;探讨AR地图导览小程序的开发方案。 编辑搜图 …

MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。

本篇文章主要讲解MAC系统安装PHP、Java、Python、mysql、Composer等环境无权限问题的详细操作方法说明。通过本篇文章你可以快速掌握brew安装相对应环境的能力。 作者&#xff1a;任聪聪 日期&#xff1a;2024年4月12日 一、brew介绍及安装说明 官网地址&#xff1a;https://b…

工具推荐:市面上有哪些AI智能客服机器人比较好用?

在这个客户期望得到即时响应的时代&#xff0c;AI智能客服机器人成为了许多企业提高客户满意度和效率的重要工具。这些机器人利用最新的人工智能技术&#xff0c;可以24/7无休止地回答客户的查询&#xff0c;处理常见问题&#xff0c;甚至在必要时将问题转接给真人客服。接下来…

大数据架构之关系型数据仓库——解读大数据架构(二)

文章目录 前言什么是关系型数仓对数仓的错误认识与使用自上而下的方法关系型数仓的优点关系型数仓的缺点数据加载加载数据的频率如何确定变更数据 关系型数仓会消失吗总结 前言 本文对关系型数据仓库&#xff08;RDW&#xff09;进行了简要的介绍说明&#xff0c;包括什么是关…

50. QT/QML中创建多线程的方式汇总

1. 说明 在QT / QML中创建线程主要有三种方式。第一种:在定义类时继承 QThread 这个类,然后重写父类的虚函数 run(),将子线程需要执行的业务代码放到 run() 函数当中即可。**注意:**这种方式官方已经摒弃了。第二种:使用moveToThread()函数将需要在子线程中执行的函数类移…

OOCT WPF_D3D项目报错无法加载依赖项

运行示例项目报错缺少dll&#xff0c;发现运用了这个大老李&#xff0c;通过添加PATH路径也无法解决&#xff0c;看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项&#xff0c;图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…