vue3+ts+vant4 实现购物车 前端代码

一、功能效果

二、前端代码

购物车的vue代码

<template>
  <van-nav-bar left-text="返回" title="购物车" @click-left="onClickLeft">

    <template #right>
      <van-popover v-model:show="showPopover" placement="bottom-end" :actions="actions" @select="onSelect">
        <template #reference>
          <van-icon name="more-o" />
        </template>
      </van-popover>
    </template>


  </van-nav-bar>

  <van-checkbox-group v-model="selectProducts" @change="ckGropChange">

    <van-swipe-cell v-for="(item, index) in cartItems" :key="item.id">

      <van-row class="box">
        <van-col span="2" class="ck"> <van-checkbox :name="item"></van-checkbox></van-col>
        <van-col span="22">
          <van-card :price="item.price" :desc="item.subName" :title="item.name" :thumb="item.img">
            <template #num>
              <van-stepper v-model="item.qty" theme="round" button-size="22" @change="computeTotalPrice" />
            </template>

          </van-card>


        </van-col>

      </van-row>


      <template #right>
        <van-button square text="删除" type="danger" class="delete-button" @click="del(item, index)" />
      </template>
    </van-swipe-cell>

  </van-checkbox-group>

  <van-submit-bar :price="totalPrice" button-text="提交订单" @submit="onSubmit">
    <van-checkbox v-model="checkedAll">全选</van-checkbox>
  </van-submit-bar>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive, watch } from "vue";
import { useRoute, useRouter } from "vue-router";
import { productApi } from '@/api/index'
const selectProducts: any = ref([])
const totalPrice = ref(0)
const showPopover = ref(false)
const checkedAll = ref(false)
const cartItems = ref([
  {
    id: 1,
    productId: 108,
    img: 'https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg',
    name: '胜者心法:资治通鉴成事之道',
    subName: '胜者心法:这是子标题',
    price: "2.00",
    qty: 1,
    checked: true
  },
  {
    id: 2,
    productId: 109,
    img: 'https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg',
    name: '认知破局 怎样突破能力、视野和思维的局限',
    subName: '胜者心法:这是子标题',
    price: "3.00",
    qty: 2,
    checked: false
  }
])
const actions = [
  { text: '清空所有', id: 1 },
  { text: '清空所选', id: 2 },
  { text: '选项三' },
];
onMounted(() => {
  selectProducts.value = cartItems.value.filter(item => item.checked == true)

  if (cartItems.value.length == selectProducts.value.length) {
    checkedAll.value = true
  }
  computeTotalPrice()
})

const onSelect = (action) => {
  if (action.id == 1) {
    //呼叫清空购物车清空接口
    cartItems.value = []
    selectProducts.value = []
  }

};
const ckGropChange = () => {
  computeTotalPrice()
  if (cartItems.value.length == selectProducts.value.length) {
    checkedAll.value = true
  }

  if (selectProducts.value.length == 0) {
    checkedAll.value = false
  }
}

const computeTotalPrice = () => {
  let total_Price = 0

  selectProducts.value.forEach((item: any) => {
    total_Price += item.qty * item.price
  });

  totalPrice.value = total_Price * 100
}

watch(() => checkedAll.value, (newValue, oldValue) => {
  if (newValue) {
    selectProducts.value = cartItems.value
  } else {

    selectProducts.value = []
  }

})
const del = (item: any, index: number) => {
  //呼叫接口,从用户购物车里面删除这个商品  item.productId
  cartItems.value.splice(index, 1)

  selectProducts.value = selectProducts.value.filter((it: any) => it.id != item.id)

  if (cartItems.value.length == selectProducts.value.length) {
    checkedAll.value = true
  }

  if (selectProducts.value.length == 0) {
    checkedAll.value = false
  }
}
const onSubmit = () => {

  console.log(selectProducts.value);
};



const onClickLeft = () => history.back();

</script>


<style scoped>
.delete-button {
  height: 100%;
}

.ck {
  display: flex;
  justify-content: center;
  align-items: center;
}

.box {
  border-radius: 15px;
  margin: 5px 10px 5px 10px;
  background-color: #fff;
}

.van-card {
  background-color: #fff;
  border-radius: 15px;
}
</style>

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

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

相关文章

SQLite数据库免改造透明加密解决方案:给数据加把锁

在数字化时代&#xff0c;信息安全和隐私保护显得尤为重要。TDE透明加密技术&#xff0c;是一种在用户无感知的情况下对数据进行加密和解密的技术。它能够在数据生成、存储、传输和使用过程中自动进行加密处理&#xff0c;无需用户手动操作。透明加密技术的核心在于其透明性&am…

登录接口测试

登录接口测试 数据驱动

java spring cloud 企业工程管理系统源码+二次开发+定制化服务 em

在建筑行业中&#xff0c;工程项目管理软件&#xff08;工程项目管理系统&#xff09;扮演着至关重要的角色&#xff0c;它为建设工程项目管理提供了全方位、全过程的综合管理支持。从项目组织建设、策划决策、规划设计&#xff0c;到施工建设、竣工交付、总结评估&#xff0c;…

丰田精益生产的模板

丰田精益生产&#xff0c;也被称为丰田生产方式&#xff08;Toyota Production System, TPS&#xff09;&#xff0c;是一套完整的生产和管理系统&#xff0c;其核心目标是最大化效率、消除浪费&#xff0c;并通过持续改进来提升产品质量。 学习优秀企业 学习福特 丰田精益生产…

Java对象大小计算与MAT内存泄露分析

文章目录 JVM内存布局对象头实例数据对齐填充 计算实例数组占用内存大小String占用内存大小对象占用内存计算 使用jmap的方式查看Instrumentation计算对象内存方式MAT内存分析示例 JVM内存布局 一个对象主要包含下面3个部分&#xff1a; 对象头(Header)实例数据(Instance Dat…

WAF绕过(下)

过流量检测 这里的流量检测就是在网络层的waf拦截到我们向webshell传输的数据包&#xff0c;以及webshell返回的数据 包&#xff0c;检测其中是否包含敏感信息的一种检测方式。如果是大马的情况下&#xff0c;可以在大马中添加多处判断代码&#xff0c;因此在执行大马提供的功…

最新FinalShell专业版激活

支持的版本 可以激活任意版本的FinalShell为专业版&#xff0c;包括最新版4.3.10 激活方式 打开FinalShell&#xff0c;点击左下角 激活/升级。 账号密码任意输入几个字符&#xff0c;点离线激活。 复制机器码&#xff0c;将机器码发送给微信公众号【小白学算法】见文章末…

如何解决Nginx反向代理不生效?

目录 背景 过程 日志 检查配置文件 重启服务 检查容器内的配置文件 容器和宿主机 其他 背景 用了两年的nginx新加的反向代理不生效 Docker挂载的配置文件启动的Nginx&#xff0c;配置一切正常&#xff0c;但是反向代理不生效&#xff0c;???先自查一波 过程 日志 …

Function Calling 介绍与实战

functions 是 Chat Completion API 中的可选参数&#xff0c;用于提供函数定义。其目的是使 GPT 模型能够生成符合所提供定义的函数参数。请注意&#xff0c;API不会实际执行任何函数调用。开发人员需要使用GPT 模型输出来执行函数调用。 如果提供了functions参数&#xff0c;…

创新指南|利用电商产品视频进行渠道营销的最佳策略,不断提升销售额

无论企业的利基市场如何&#xff0c;电商产品视频都已被证明是非常可靠的资产&#xff0c;可以让目标受众了解您所提供的产品——关键功能、展示重要的差异化优势甚至改变大多数营销活动的游戏规则。阅读本文&#xff0c;全面了解电商产品视频如何融入营销推广&#xff0c;以最…

【保姆级教程】基于OpenCV+Python的人脸识别上课签到系统

【保姆级教程】基于OpenCVPython的人脸识别上课签到系统 一、软件安装及环境配置1. 安装IDE&#xff1a;PyCharm2. 搭建Python的环境3. 新建项目、安装插件、库 二、源文件编写1. 采集人脸.py2. 训练模型.py3. 生成表格.py4. 识别签到.py5. 创建图形界面.py 三、相关函数分析1.…

浅谈分布式系统

目录 一、单机架构二、分布式架构1、应用服务与数据库分离2、负载均衡3、数据库读写分离4、引入缓存5、数据库分库分表6、引入微服务 一、单机架构 单机架构&#xff0c;只有一台服务器&#xff0c;这个服务器负责所有工作。 绝大多数公司的产品&#xff0c;都是这种单机架构。…

思科模拟器--06.单臂路由升级版--多端路由互连实验--24.5.20

实验图纸如下: 第0步: 先放置六台个人电脑,一台交换机和一台2911路由器(千兆路由器(G0开头的)) 接着,用直通线将 PC0的F0,PC1的F0分别和交换机的F0/0, F0/1连接 交换机的F0/3和路由器的G0/0连接 PC2的F0,PC3的F0分别和交换机的F0/4, F0/5连接 交换机的F0/6和路由器的G0/1…

【施磊】C++语言基础提高:深入学习C++语言先要练好的内功

课程总目录 文章目录 一、进程的虚拟地址空间内存划分和布局二、函数的调用堆栈详细过程三、程序编译链接原理1. 编译过程2. 链接过程 一、进程的虚拟地址空间内存划分和布局 任何的编程语言 → \to → 产生两种东西&#xff1a;指令和数据 编译链接完成之后会产生一个可执行…

【传知代码】Modnet 人像抠图-论文复现

文章目录 概述原理介绍核心逻辑ModNet 的结构 环境配置WebUI 小结 论文地址 论文GitHub 本文涉及的源码可从Modnet 人像抠图该文章下方附件获取 概述 人像抠图技术在多个领域有着广泛的应用场景&#xff0c;包括但不限于&#xff1a; 展馆互动拍照&#xff1a;展馆中使用的抠…

K8S认证|CKA题库+答案| 11. 创建PVC

11、创建PVC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node ok8s master …

玩转OpenHarmony智能家居:如何实现开发版“碰一碰”设备控制

一、简介 “碰一碰”设备控制&#xff0c;依托NFC短距通信协议&#xff0c;通过碰一碰的交互方式&#xff0c;将OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;标准系统设备和全场景设备连接起来&#xff0c;解决了应用与设备之间接续慢、传输难的问题&…

Java web应用性能分析之【高并发之缓存-多级缓存】

说到缓存&#xff0c;作为java开发第一时间想到的是不是上图所示的Redis&#xff0c;又或者是Guava Cache、Caffeine、EhCache这些&#xff1b;Redis作为分布式缓存、其他的可以作为本地缓存。但是作为一名资深开发人员&#xff0c;着眼的层面应该再提升一个级别&#xff0c;从…

LLM多模态——GPT-4o改变人机交互的多模式 AI 模型应用

1. 概述 OpenAI 发布了迄今为止最新、最先进的语言模型 – GPT-4o也称为“全“ 模型。这一革命性的人工智能系统代表了一次巨大的飞跃&#xff0c;其能力模糊了人类和人工智能之间的界限。 GPT-4o 的核心在于其原生的多模式特性&#xff0c;使其能够无缝处理和生成文本、音频…

微信小程序开发环境的搭建

一、注册微信小程序账号 二、安装微信开发者工具 1.下载微信开发者工具。 官网下载地址&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/downloads.html 2、选择稳定版Window64下载安装 3、下载完毕后&#xff0c;点击下一步安装 三、使用微信开发者工具…