vue实现购物车案例

话不多说,先上效果图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装elementui组件库,可直接食用。

<template>
  <div>
    <!-- 购物车部分 -->
    <el-container>
      <el-header><h1>购物车案例一条龙</h1></el-header>
      <el-main>
        <!-- 折叠面板展示不同商店的商品 -->
        <el-collapse v-model="activeNames" accordion>
          <!-- 遍历商店列表 -->
          <el-collapse-item
            v-for="(store, index) in stores"
            :title="store.name"
            :name="'store' + index"
            :key="store.name"
          >
            <!-- 使用表格展示商品信息 -->
            <el-table :data="store.items" style="width: 100%">
              <el-table-column prop="name" label="商品名称"></el-table-column>
              <el-table-column prop="price" label="价格"></el-table-column>
              <el-table-column label="数量">
                <template slot-scope="scope">
                  <!-- 使用输入框控件调整商品数量 -->
                  <el-input-number
                    v-model="scope.row.quantity"
                    :min="1"
                    @change="updateQuantity(scope.row)"
                  ></el-input-number>
                </template>
              </el-table-column>
              <el-table-column label="操作">
                <template slot-scope="scope">
                  <!-- 移除商品按钮 -->
                  <el-button
                    type="danger"
                    @click="removeItem(store, scope.$index)"
                    >移除</el-button
                  >
                </template>
              </el-table-column>
            </el-table>
          </el-collapse-item>
        </el-collapse>
      </el-main>
      <el-footer>
        <!-- 显示购物车总计价格 -->
        <div>总计:{{ getTotalPrice() }}</div>
        <!-- 结算按钮 -->
        <el-button type="primary" @click="showCheckout">结算</el-button>
      </el-footer>
    </el-container>

    <!-- 收货流程模态框 -->
    <el-dialog :visible.sync="dialogVisible" width="60%" center>
      <!-- 步骤条 -->
      <el-steps :active="active" finish-status="success" align-center>
        <el-step title="选择收货地址" icon="el-icon-location"></el-step>
        <el-step title="付款" icon="el-icon-bank-card"></el-step>
        <el-step title="完成" icon="el-icon-check"></el-step>
      </el-steps>

      <div v-show="active === 0" class="center-content">
        <!-- 显示收货地址选择 -->
        <h2>请选择收货地址:</h2>
        <el-radio-group v-model="selectedAddress">
          <el-radio
            :label="address"
            v-for="(address, index) in addresses"
            :key="index"
            >{{ address.name }} - {{ address.address }} - {{ address.city }} -
            {{ address.zip }}</el-radio
          >
        </el-radio-group>
      </div>

      <div v-show="active === 1" class="center-content">
        <!-- 显示付款信息 -->
        <h2>请完成付款</h2>
        <!-- 可以放置付款表单或者其他付款相关内容 -->
        <div style="margin-top: 20px">
          <el-button @click="pay" type="primary">确认付款</el-button>
          <el-button @click="prevStep">返回</el-button>
        </div>
      </div>

      <div v-show="active === 2" class="center-content">
        <!-- 显示付款完成信息 -->
        <h2>付款完成</h2>
        <!-- 展示购买的商品信息、总计和收货地址 -->
        <div v-if="selectedAddress">
          <h3>购买的商品信息:</h3>
          <!-- 使用 el-table-tree 来展示购买的商品信息 -->
          <el-table :data="selectedItems" style="width: 100%">
            <el-table-column type="expand">
              <template slot-scope="props">
                <!-- 子商品信息 -->
                <el-table :data="props.row.children" style="width: 100%">
                  <el-table-column
                    prop="name"
                    label="商品名称"
                  ></el-table-column>
                  <el-table-column prop="price" label="价格"></el-table-column>
                  <el-table-column
                    prop="quantity"
                    label="数量"
                  ></el-table-column>
                </el-table>
              </template>
            </el-table-column>
            <!-- 商店名称列 -->
            <el-table-column
              prop="storeName"
              label="商店名称"
            ></el-table-column>
          </el-table>
          <!-- 收货地址信息 -->
          <div>
            收货地址:{{ selectedAddress.name }} -
            {{ selectedAddress.address }} - {{ selectedAddress.city }} -
            {{ selectedAddress.zip }}
          </div>
        </div>
        <!-- 关闭模态框按钮 -->
        <div style="margin-top: 20px">
          <el-button @click="closeDialog" type="primary">关闭</el-button>
        </div>
      </div>

      <div slot="footer" class="dialog-footer" v-show="active !== 2">
        <!-- 下一步按钮 -->
        <el-button @click="nextStep" type="primary">下一步</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dialogVisible: false,
      active: 0,
      addresses: [
        { name: "张三", address: "北京市朝阳区", city: "北京", zip: "100000" },
        {
          name: "李四",
          address: "上海市浦东新区",
          city: "上海",
          zip: "200000",
        },
        { name: "王五", address: "广州市天河区", city: "广州", zip: "300000" },
        { name: "赵六", address: "深圳市南山区", city: "深圳", zip: "400000" },
      ],
      selectedAddress: null, // 存储选中的收货地址
      stores: [
        {
          name: "阳光超市",
          items: [
            { id: 1, name: "红烧肉", price: 28, quantity: 2 },
            { id: 2, name: "麻辣香锅", price: 38, quantity: 1 },
            { id: 3, name: "西湖醋鱼", price: 48, quantity: 3 },
          ],
        },
        {
          name: "小龙虾馆",
          items: [
            { id: 4, name: "香辣小龙虾", price: 58, quantity: 1 },
            { id: 5, name: "麻辣小龙虾", price: 68, quantity: 2 },
            { id: 6, name: "蒜蓉小龙虾", price: 78, quantity: 2 },
          ],
        },
      ],
      activeNames: [], // 折叠面板激活的面板名称数组
    };
  },
  computed: {
    selectedItems() {
      // 获取选中的商品列表
      const selectedItems = [];
      for (const store of this.stores) {
        const storeItems = store.items.filter((item) => item.quantity > 0);
        if (storeItems.length > 0) {
          selectedItems.push({ storeName: store.name, children: storeItems });
        }
      }
      return selectedItems;
    },
  },
  methods: {
    removeItem(store, index) {
      // 移除商品
      store.items.splice(index, 1);
    },
    updateQuantity(item) {
      // 更新商品数量
      item.quantity = Math.max(1, parseInt(item.quantity) || 1);
    },
    getTotalPrice() {
      // 计算购物车总价
      let totalPrice = 0;
      for (const store of this.stores) {
        totalPrice += store.items.reduce(
          (total, item) => total + item.price * item.quantity,
          0
        );
      }
      return totalPrice;
    },
    showCheckout() {
      // 显示结算模态框
      this.dialogVisible = true;
    },
    nextStep() {
      // 进入下一步
      this.active++;
    },
    prevStep() {
      // 返回上一步
      this.active--;
    },
    pay() {
      // 处理付款逻辑,这里可以放置付款的相关操作
      // 付款成功后进入下一步
      this.nextStep();
    },
    closeDialog() {
      // 关闭模态框
      this.dialogVisible = false;
      // 重置步骤状态
      this.active = 0;
    },
  },
};
</script>

<style>
.center-content {
  text-align: center;
}
</style>

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

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

相关文章

springboot Feign方式注入注解详解

一、FeignClient注解详解 FeignClient是Spring Cloud中用于声明Feign客户端的注解&#xff0c;它使得编写HTTP客户端变得更简单。通过Feign的自动化配置机制&#xff0c;可以很容易地编写HTTP API客户端。以下是FeignClient的详解&#xff1a; 作用&#xff1a;FeignClient注解…

龙年立 Flag,Whale 帷幄 2024 的五大关键词

回顾 2023&#xff0c;AIGC 浪潮的出现&#xff0c;为各行各业带来了更多的商业可能性。在农历新年到来之际&#xff0c;我们也展望 2024&#xff0c;为打好新的硬仗做好充分的准备。 以下 5 大关键词即是「Whale 帷幄」接下来努力的方向和目标。 「盈利」 在 2024 年&#xff…

骨传导运动蓝牙耳机哪个好?五款性价比骨传导运动蓝牙耳机推荐

近两年来&#xff0c;骨传导运动蓝牙耳机在运动领域内日益流行。与传统耳机相比&#xff0c;它的显著优势是能够保持双耳开放&#xff0c;不会堵塞耳道&#xff0c;消除了入耳式耳机可能引起的不适感。此外还能避免运动时耳内出汗可能导致的各种卫生和健康问题。很多人就问了&a…

pmp报考的条件以及考试内容有分享一下的吗?

PMP 是项目管理的入门级证书&#xff0c;全称是项目管理专业人士资格认证&#xff0c;由美国项目管理协会&#xff08;PMI&#xff09;举办的&#xff0c;受到全球200多个国家的认可&#xff0c;从1999 年到现在已经有20多年发展历史了。 顾名思义&#xff0c;PMP考试就是一场…

OpenCV与机器学习:使用opencv和sklearn实现线性回归

前言 线性回归是一种统计分析方法&#xff0c;用于确定两种或两种以上变量之间相互依赖的定量关系。在统计学中&#xff0c;线性回归利用线性回归方程&#xff08;最小二乘函数&#xff09;对一个或多个自变量&#xff08;特征值&#xff09;和因变量&#xff08;目标值&#…

华为 Huawei 交换机 黑洞MAC地址的作用和配置示例

黑洞mac作用&#xff1a;某交换机上配置某个PC的mac地址为黑洞mac&#xff0c;那么这台PC发出来的包都会被交换机丢弃&#xff0c;不会被转发到网络中。 组网需求&#xff1a; 如 图 2-13 所示&#xff0c;交换机 Switch 收到一个非法用户的访问&#xff0c;非法用户的 MAC 地址…

NX/UG二次开发—其他—矩形套料(排料)简介

算法逻辑 排料方法一定时间内获取近似解的算法 看了一些论文和博客&#xff0c;一般排料方法采用最低水平线算法排料&#xff0c;再此基础上增加空余区域填充。 然后配合遗传学算法||模拟退火算法||蚁群算法||免疫算法等&#xff0c;在一定时间内求得一组最优解。 在最简单的…

6.electron之上下文隔离,预加载JS脚本

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中&#xff0c;因此它允许你仅需一个代码仓库&#xff0c;就可以撰写支持 Windows、…

跟着pink老师前端入门教程-day21

5.4 常见flex布局思路 5.5 背景线性渐变 语法&#xff1a; background: linear-gradient( 起始方向 , 颜色 1, 颜色 2, ...); background: -webkit-linear-gradient(left, red , blue); background: -webkit-linear-gradient(left top, red , blue); 背景渐变必须添加浏览…

网站被攻击有什么办法呢?

最近&#xff0c;德迅云安全遇到不少网站用户遇到攻击问题&#xff0c;来咨询安全解决方案。目前在所有的网络攻击方式中&#xff0c;DDoS是最常见&#xff0c;也是最高频的攻击方式之一。不少用户网站上线后&#xff0c;经常会遭受到攻击的困扰。有些攻击持续时间比较短影响较…

飞天使-k8s知识点13-kubernetes散装知识点2-statefulsetdaemonset

文章目录 RC RS DeploymentStatefulSet有状态服务控制器DaemonSet守护进程与任务job cronjob RC RS Deployment StatefulSet有状态服务控制器 statefulset StatefulSet 是 Kubernetes 1.9 版本引入的一个新的 API 对象&#xff0c;主要用于处理有状态的服务。StatefulSet 与 De…

java的excel列行合并模版

1.效果 2.模版 <tableborder"1"cellpadding"0"cellspacing"0"class"tablebor"id"TABLE"><tr align"center" class"bg217"><td style"background-color: #008000; color: #ffffff;p…

安卓学习笔记之八:本地化的简单例子(kotlin版本)

本地化及多语言支持&#xff0c;是目前手机软件必须面对的问题&#xff0c;这里用一个简单的例子来说明在Android Studio下如何实现。 创建一个Empty Views Activity项目&#xff0c;语言选择Kotlin 实现一个简单的功能&#xff0c;一条欢迎&#xff0c;一个按钮&#xff0c;…

QT设置qss

Qt设置qss文件&#xff08;设置在qrc中&#xff09; 1、右击项目选择添加新文件 2、在弹出的对话框中选择Qt -> Qt Resource File 3、随便起一个名称 4、在代码路径下新建一个stylesheet.qss文件&#xff0c;随便写入一些样式 5、右击resources.qrc&#xff0c;选择添加…

嵌入式系统设计师

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 第一章 计算机系统基础1、数值转换数的转换数据的存储单位 第一章 计算机系统基础 1、数值转换 数的转换 数据的存储…

电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列) 所谓预测,就是指通过对事物进行分析及研究,并运用合理的方法探索事物的发展变化规律,对其未来发展做出预先估计和判断…

vue项目打包时如何去除文件的hash值?

默认情况下&#xff0c;生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存。然而&#xff0c;这也要求 index 的 HTML 是被 Vue CLI 自动生成的。如果你无法使用 Vue CLI 生成的 index HTML&#xff0c;你可以通过将这个选项设为 false 来关闭文件名哈希。 vue.c…

分享3款开源免费好用的Docker可视化管理工具安装部署教程

文章目录 1.前言2.Docker Desktop3.Portainer3.1 Portainer默认英文版本安装3.2 Portainer汉化版本安装3.3官方镜像说明3.3.1ssl访问3.3.2Nginx反代3.3.3Nginx反代设置子目录3.3.4docker-compose部署 3.4登录 4.DockerUI4.1简介4.2项目地址4.3部署启动命令4.4登录4.5首页 5.总结…

相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Django模板(三)

一、标签URL 返回与给定视图和可选参数相匹配的绝对路径引用(不含域名的 URL) {% url some-url-name v1 v2 %} 第一个参数是url模式名称,后面跟着的是参数,以空格分隔可以使用关键字: {% url some-url-name arg1=v1 arg2=v2 %}如果您想检索命名空间的URL,请指定完全限定…