使用Vuex实现商品列表的校验、添加、删除、统计

news2025/1/18 11:02:28

场景:使用Vuex实现一个商品列表的添加、删除以及利用Vuex中的getters属性计算商品列表的总数总价格

添加商品时判断当前商品列表中是否包含了相同的商品

添加商品时,对添加表单做了校验

 Vuex的使用及原理已经在上篇文章中介绍过了 

vue2.x中使用vuex_前端-文龙刚的博客-CSDN博客

最终的效果:

 

 开始实现

 第一步:先布局页面

        html

<el-card>
      <div slot="header" class="clearfix">
        <div class="shopCountMoney">
          <span>通过getters获取的商品价格是:{{ shopMoney }}</span>
          <span>通过getters获取的商品数量是:{{ shopCount }}</span>
        </div>
        <div class="addShopTemp">
          <el-form :inline="true" :rules="shopRules" ref="addShopFormRef" :model="addShopData" status-icon class="shopForm">
            <el-form-item label="商品名称" prop="shopName">
              <el-input v-model="addShopData.shopName" placeholder="请输入商品名称" clearable></el-input>
            </el-form-item>
            <el-form-item label="商品单价" prop="shopPrice">
              <el-input v-model.number="addShopData.shopPrice" placeholder="请输入商品单价" clearable></el-input>
            </el-form-item>
            <el-form-item label="商品数量" prop="shopCount">
              <el-input v-model.number="addShopData.shopCount" placeholder="请输入商品数量" clearable></el-input>
            </el-form-item>
          </el-form>
          <el-button type="primary" size="mini" icon="el-icon-plus" @click="addShop">添加商品</el-button>
        </div>
      </div>
      <el-table :data="$store.state.shopCart" border show-summary :summary-method="getSummaries" style="width:100%">
      <el-table-column fixed type="index" label="序号" align="center" width="100" />
      <el-table-column prop="shopName" label="商品名称" align="left" header-align="center" />
      <el-table-column prop="shopPrice" label="商品单价(元)" align="right" header-align="center" />
      <el-table-column prop="shopCount" label="商品数量(个)" align="right" header-align="center" />
      <el-table-column fixed="right" label="操作" align="center">
        <template slot-scope="scope">
          <el-button type="danger" size="mini" icon="el-icon-delete" @click="deleteShop(scope.row)">删除商品</el-button>
        </template>
      </el-table-column>
    </el-table>
</el-card>

        css

.addShopTemp{display:flex;align-items:center;}
  .shopForm{float:left;}
  .shopForm .el-form-item{margin-bottom:0;}
  .shopCountMoney{padding:10px 0;}
  .shopCountMoney span{margin-right:10px;font-weight:600;}
  .shopCountMoney span:nth-child(1){color: brown;}
  .shopCountMoney span:nth-child(2){color: cornflowerblue;}

第二步:对表单做校验

shopRules:{
        shopName:[
          { required: true, message: '请输入商品名称', trigger: 'blur' },
        ],
        shopPrice:[
          { required: true, message: '请输入商品单价', trigger: 'blur' },
          { type: 'number', message: '商品单价必须为数字值'}
        ],
        shopCount:[
          { required: true, message: '请输入商品数量' },
          { type: 'number', message: '商品数量必须为数字值'}
        ]
      }

第三步:在组件页面中定义 添加 / 删除 方法 

addShop(addShopData){//添加商品(做一个添加商品的表单,添加的时候,判断是否已经添加过)
      this.$refs.addShopFormRef.validate(valid => {
        if(valid){
          var idRandom = Math.random();//定义一个随机数,用来代替id
          let shopItem={//定义一个对象,用作最终的数据提交
            id:idRandom,
            shopName:this.addShopData.shopName,
            shopPrice:this.addShopData.shopPrice,
            shopCount:this.addShopData.shopCount
          }
          // console.log('页面中添加的商品对象:',shopItem)
          this.$store.commit('addStoreShopItem',shopItem)//使用store中的方法添加商品
          this.$refs.addShopFormRef.resetFields()//清空表单
          
        }
      })
    },
    deleteShop(item){//删除商品
      this.$confirm('是否确定删除该商品?', '删除', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
        }).then(() => {
            this.$store.commit('deleteShopItem',item)//调用vuex中的删除
            // this.$message({
            //     type: 'success',
            //     message: '删除成功!'
            // });
        }).catch(() => {
            this.$message({
                type: 'info',
                message: '已取消删除'
            });          
        });
    },

  第四步:在Vuex中定义商品列表数据、添加 / 删除 的方法

        state.js

shopCart:[//商品列表
        {
            id: 1,
            shopName: '苹果手机',
            shopPrice:6000,
            shopCount: 1
          },
          {
            id: 2,
            shopName: '华为手机',
            shopPrice: 5000,
            shopCount: 1
          },
          {
            id: 3,
            shopName: '小米手机',
            shopPrice: 4000,
            shopCount: 1
          }
    ]

        mutations.js

addStoreShopItem(state,obj){//添加商品方法
        // console.log('传递到store中的对象是:',obj)
        // console.log('store中的商品列表:',state.shopCart)
        const addType = state.shopCart.some((item)=>{//判断添加的id或名称跟已有的数组中的id或名称一样,并return结果
            if((obj.id == item.id) || (obj.shopName==item.shopName)){
                return true
            }else{
                return false
            }
        })
        if(!addType){//如果没有相同名称或id的话,就让添加
            state.shopCart.push(obj)
        }else{
            Message.error("不能添加相同名称的商品")
            return
        }
    },
    deleteShopItem(state,obj){//删除商品
        state.shopCart.some((item,index)=>{
            if(obj.id == item.id){
                state.shopCart.splice(index,1)
                Message.success("删除成功!!!")
                return true
            }
        })
    }

        getters.js

shopMoney:(state)=>{//计算商品的总价格
        let total = 0
        state.shopCart.map(item=>{
            total+=item.shopCount*item.shopPrice
        })
        //或者这个方法:const total = state.shopCart.map(item => item.shopCount * item.shopPrice).reduce((a, b) => a + b, 0);
        return total
    },
    shopCount:(state)=>{//计算商品的总数
        let count = 0
        state.shopCart.map(item=>{
            count+=item.shopCount
        })
        return count
    }

 好了,到这已经实现了商品列表的校验/添加/删除/统计功能   (#^.^#)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XLSX插件使用 — 导入导出(含中文表头)(React+Antd 对上传表格做数据格式验证)

需求说明 1.需要前端做数据导出&#xff08;非调用接口&#xff09; 2.需要对上传的表格数据做验证&#xff0c;不通过验证需要提示格式不正确&#xff0c;阻拦上传 技术栈介绍 ReactAntdesignXLSX js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取…

Kafka技术认知

文章目录概念理解名词解释基本架构工作流程Kafka的特性概念理解 Kafka是分布式的基于发布-订阅消息队列。是一个分布式、支持分区的、多副本的&#xff0c;基于 Zookeeper 协调的分布式消息中间件系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景…

FISCO BCOS 搭建区块链,在SpringBoot中调用合约

一、搭建区块链 使用的是FISCO BCOS 和 WeBASE-Front来搭建区块链&#xff0c;详细教程&#xff1a; https://blog.csdn.net/yueyue763184/article/details/128924144?spm1001.2014.3001.5501 搭建好能达到下图效果即可&#xff1a; 二、部署智能合约与导出java文件、SDK证…

【C语言】程序环境和预处理

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C语言专栏&#xff1a;https://blog.csdn.net/vhhhbb/category_12174730.html 小苏希望大家能从这篇文章中收获到许…

决策树和期望货币价值

1、决策树和期望货币价值&#xff08;决策树、表&#xff09;---风险管理决策树分析是风险分析过程中的一项常用技术。某企业在项目风险分析过程中&#xff0c;采用了决策树分析方法&#xff0c;并计算出了EMV&#xff08;期望货币值&#xff09;。以下说法中&#xff0c;正确的…

使用 OpenAI 的 ChatGPT 提高开发人员的工作效率

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 介绍 作为一名开发人…

第十天栈和队列

栈和队列的原理大家应该很熟悉了&#xff0c;队列是先进先出&#xff0c;栈是先进后出。首先大家要知道 栈和队列是STL&#xff08;C标准库&#xff09;里面的两个数据结构。接下来介绍的栈和队列也是SGI STL里面的数据结构&#xff0c; 知道了使用版本&#xff0c;才知道对应的…

雅思经验(6)

反正我是希望遇到的雅思听力section 4.里面填空的地方多一些&#xff0c;之后单选的部分少一些。练了一下剑9 test3 的section 4&#xff0c;感觉还是不难的&#xff0c;都是在复现&#xff0c;而且绕的弯子也不是很多。本次考试的目标就是先弄一个六分&#xff0c;也就是说&am…

构建Jenkins 2.340持续集成环境

一、前言 本文学习自&#xff1a;2022版Jenkins教程&#xff08;从配置到实战) 如有不妥&#xff0c;欢迎指正 二、构建资料 已经包括了本文档使用的所有所需的安装包 三、安装docker 1、解压docker docker-20.10.10.tgz2、复制文件 cp docker/* /usr/bin/3、编写启动文…

第三节 第一个内核模块

hellomodule 实验 实验说明 硬件介绍 本节实验使用到STM32MP157 开发板 实验代码讲解 本章的示例代码目录为&#xff1a;linux_driver/module/hellomodule 从前面我们已经知道了内核模块的工作原理&#xff0c;这一小节就开始写代码了&#xff0c;跟hello world 一样&…

经典文献阅读之--PLC-LiSLAM(面,线圆柱SLAM)

0. 简介 对于激光SLAM来说&#xff0c;现在越来越多的算法不仅仅局限于点线等简答特征的场景了&#xff0c;文章《PLC-LiSLAM: LiDAR SLAM With Planes, Lines,and Cylinders》说到&#xff0c;平面、线段与圆柱体广泛存在于人造环境中。为此作者提出了一个使用这些landmark的…

kafka集群搭建及问题

一、zookeeper集群搭建 1、创建文件夹 cd /home mkdir zookeeper 2、下载 cd zookeeper wget https://downloads.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz 解压到当前文件夹 tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz 文件夹重命…

icomoon字体图标的使用

很久之前就学习过iconfont图标的使用&#xff0c;今天又遇到一个用icomoon字体图标写的案例&#xff0c;于是详细学习了一下&#xff0c;现整理如下。 一、下载 1.网址&#xff1a; https://icomoon.io/#home 2.点击IcoMoon App。 3.点击 https://icomoon.io/app 4.进入IcoM…

每天10个前端小知识 【Day 10】

前端面试基础知识题 1. es5 中的类和es6中的class有什么区别&#xff1f; 在es5中主要是通过构造函数方式和原型方式来定义一个类&#xff0c;在es6中我们可以通过class来定义类。 class类必须new调用&#xff0c;不能直接执行。 class类执行的话会报错&#xff0c;而es5中…

【PyTorch】教程:Transfer learning

Transfer learning 实际工作中&#xff0c;只有很少的人从头开始训练 CNN&#xff0c;因为很难获得大量的样本。一般情况下&#xff0c;会通过调用预训练模型&#xff0c;例如 ConvNet 在 ImageNet&#xff08;1.2 M 图像 1000 个类别&#xff09;,可以用 ConvNet 初始化&#…

Verilog 组合逻辑一些注意事项

reg型变量不一定会被综合成触发器 【参考链接】 以下是verilog-2001的标准中对wire和reg的定义如下&#xff1a; wire&#xff1a; A wire net can be used for nets that are driven by a single gate or continuous assignment. reg&#xff1a; Assignments to a reg are…

微信小程序 Springboot java nodejs图书馆图书借阅系统

图书借阅管理系统用户端是基于微信小程序&#xff0c;管理员端是基于java编程语言&#xff0c;mysql数据库&#xff0c; idea工具开发&#xff0c;本系统是分为用户和管理员两个角色&#xff0c;其中用户的主要功能有注册登陆小程序&#xff0c;查看系统功能&#xff0c;图书搜…

VB 消息、消息队列、事件

windows是图像化界面&#xff0c;多任务消息windows系统将消息&#xff08;大的结构&#xff09;发给其他应用程序Windows消息包含了所有的外部输入或者计算机内部信息&#xff0c;应用程序的消息队列先进先出&#xff0c;Windows消息的循环--每个应用程序里有自己的消息循环外…

微信卸载后重装的聊天记录还能找回吗?

很多人微信卸载后&#xff0c;问能不能恢复之前的聊天记录&#xff1f; 我想大家肯定都去百度搜索了&#xff0c;能搜出来可行的办法了么&#xff0c;没有是吧&#xff0c;那就看看我能不能帮到你&#xff0c;根据我的经验来解决。 答&#xff1a;理论上是不能的&#xff0c;因…

SpringBoot集成swagger3(CD2207)(内含教学视频+源代码)

SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87435564 目录SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#…