购物车案例的实现

news2024/11/17 19:48:22

最终效果: 

1.计算属性

用于计算最终价格,对此计算使用计算属性最佳

原理是遍历books中的每一个属性,价格*数量

      computed:{
        totalPrice()
        {
          let totalPrice=0
          // 1.普通的for循环
          // for (let i=0;i<this.books.length;i++)
          // {
          //   totalPrice+=this.books[i].count*this.books[i].price
          // }
          // return totalPrice

          // 2.1
          // for(let i in this.books)
          // {
          //   totalPrice+=this.books[i].count*this.books[i].price
          // }

          // 2.2
          // for(let i in this.books)
          // {
          //   const book=this.books[i]
          //   totalPrice+=book.count*book.price
          // }

          //3.
           for(let item of this.books)
             {
             totalPrice+=item.price*item.count
             }
        }
      },

2.过滤器

使每个出现数字的地方自动加上小数点,以及¥

一旦设置完毕,使用非常方便

      filters: {
        showPrice(price) {
          return "¥" + price.toFixed(2)
        }
      }
<h2>总价格:{{totalPrice|showPrice}}</h2>

  

3.v-bind

按钮动态绑定disabled属性,当数量为1时不可再减少,此时禁用减号按钮

        <button @click="decrement(index)" v-bind:disabled="item.count<=1">-</button>

4.v-if/v-else

当所有书都被移除时,显示购物车为空

即只有书的种类不为空(length>=1)时渲染元素

当为空是显示购物车为空

  <div v-if="books.length">
  <h2 v-else>购物车为空</h2>

5.v-on 

当点击按钮时,书的数量变化

当点击移除时,去掉书的这一行

        <button @click="increment(index)">+</button>
      <td><button @click="removeHandler(index)">移除</button></td>
        decrement(index) {
          // console.log("decrement",index)
          this.books[index].count--
        },

        // 实现移除功能:splice
        removeHandler(index) {
          this.books.splice(index, 1)
        }

源代码:

 index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>

<div id="app">
  <div v-if="books.length">
  <table>
<!--    第一行-->
    <thead>
    <tr>
      <th></th>
      <th>书籍名称</th>
      <th>出版日期</th>
      <th>价格</th>
      <th>购买数量</th>
      <th>操作</th>
    </tr>
    </thead>
<!--    表格内容-->
    <tbody>
    <tr v-for="(item,index) in books">
<!--      此处双层遍历,内循环遍历的是item的value而非books的value-->
<!--      <td v-for="value in item">{{value}}</td>-->
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.date}}</td>
<!--      写法2,1是直接在此拼接,不用函数-->
<!--      <td>{{getFinalPrice(item.price)}}</td>-->
<!--      写法3:过滤器-->
      <td>{{item.price | showPrice}}</td>
      <td>
<!--        当数量为1时不可再减少,使用v-bind动态绑定按钮的disable属性-->
        <button @click="decrement(index)" v-bind:disabled="item.count<=1">-</button>
        {{item.count}}
        <button @click="increment(index)">+</button>
      </td>
      <td><button @click="removeHandler(index)">移除</button></td>
    </tr>
    </tbody>
  </table>
<h2>总价格:{{totalPrice|showPrice}}</h2>
  </div>
  <h2 v-else>购物车为空</h2>
</div>

<!--<button disabled>禁用此按钮</button>-->
<!--在main.js前,必须先引入vue.js-->
<script src="../js/vue.js"></script>
<script src="main.js"></script>


</body>
</html>

main.js 

const app=new Vue(
    {
      el: "#app",
      data: {
        books: [
          {
            id: 1,
            name: "算法导论",
            date: "2006-9",
            price: 85.00,
            count: 1
          },
          {
            id: 2,
            name: "UNIX编程艺术",
            date: "2006-2",
            price: 59.00,
            count: 1
          }, {
            id: 3,
            name: "编程珠玑",
            date: "2008-10",
            price: 39.00,
            count: 1
          }, {
            id: 4,
            name: "代码大全",
            date: "2006-3",
            price: 128.00,
            count: 1
          },
        ],
      },
      methods: {
        //   getFinalPrice(price)
        //   {
        //     return "¥"+price.toFixed(2)
        //   }
        //因为有多个按钮,必须根据下标判断具体是哪一个
        increment(index) {
          // console.log("increment",index)
          this.books[index].count++
        },
        decrement(index) {
          // console.log("decrement",index)
          this.books[index].count--
        },

        // 实现移除功能:splice
        removeHandler(index) {
          this.books.splice(index, 1)
        }
      },
      computed:{
        totalPrice()
        {
          let totalPrice=0
          for (let i=0;i<this.books.length;i++)
          {
            totalPrice+=this.books[i].count*this.books[i].price
          }
          return totalPrice
        }
      },
      filters: {
        showPrice(price) {
          return "¥" + price.toFixed(2)
        }
      }
      }

)

 style.css

table{
  border: 1px solid #e9e9e9;
  border-collapse: collapse;
  border-spacing: 0;
}

th,td{
  padding: 8px 16px;
  border: 1px solid #e9e9e9;
  text-align: left;
}

th{
  background-color: #f7f7f7;
  color: #5c6c77;
  font-weight: 600;
}

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

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

相关文章

java+jsp+servlet+mysql高速公路事故管理(交通管理)系统

项目介绍&#xff1a; 一个使用javamysql开发的jspservlet高速公路事故管理系统。 功能主要包括&#xff0c;事故管理&#xff08;可以上传事故照片&#xff09;、车辆信息管理、车主信息管理、违法信息管理、可以按照柱状图&#xff08;饼状图、折线图&#xff09;分析事故…

为什么你需要Twitter群控

爆粉必备 Twitter爆粉的原理是什么&#xff1f; Twitter爆粉怎么实现呢&#xff1f;你先关注别人&#xff0c;然后和人家互动&#xff0c;比如发私信、点赞、评论转发帖子&#xff0c;让别人看到你并回关你&#xff0c;一段时间不回关&#xff0c;你就取消对他们的关注&#…

html中的固定定位的用法

文章目录 前言 一、固定定位的理解&#xff1f; 二、固定定位用在哪里&#xff1f; 1、给大家分享一个案例 2、代码编写 1、先准备一个小案例 2、效果如下&#xff0c;浏览器左上角有个盒子&#xff0c;右边有滚动条 3、我想让他像我们的csdn一样&#xff0c;这个盒子固定在右下…

科技连接美好未来 | 美格智能5G FWA解决方案持续推进

近年来&#xff0c;5G网络在全球范围的全面推广和普及&#xff0c;促使市场对高速宽带连接的需求持续增长&#xff0c;5G FWA作为低成本的网络接入选项&#xff0c;或将成为5G市场新一代的杀手级应用。 5G的持续推动&#xff0c;促使FWA出货量呈现出高速增长趋势。就2020年&…

学了C++能做什么?

相信很多人接触编程都是源于大学期间的那堂C语言程序编程&#xff0c;但是这门课却只告诉了你编程语言是什么&#xff0c;却没告诉你要怎么去熟练掌握编程。所以&#xff0c;不可避免的是许多人在毕业前夕才发现虽然学会了C&#xff0c;但是好像却不知道能干什么&#xff0c;能…

[附源码]java毕业设计学生考试成绩分析系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

浅学Go下的ssti漏洞问题

前言 作为强类型的静态语言&#xff0c;golang的安全属性从编译过程就能够避免大多数安全问题&#xff0c;一般来说也唯有依赖库和开发者自己所编写的操作漏洞&#xff0c;才有可能形成漏洞利用点&#xff0c;在本文&#xff0c;主要学习探讨一下golang的一些ssti模板注入问题…

汽车制造企业借力泛微京桥通,推动采购流程化、数字化

新常态下汽车采购数字化是趋势 随着互联网的发展、智能技术的兴起和市场竞争态势的变革&#xff0c;汽车制造企业不断融合新技术&#xff0c;打造新产品&#xff1b;同时&#xff0c;融合线上线下的营销和服务方式&#xff0c;创新运营模式&#xff0c;提升业务效率。 汽车制…

Android Java反射与Proxy动态代理详解与使用基础篇(一)

一、介绍 什么是反射&#xff1f; 反射是java语言的一个特性&#xff0c;它允程序在运行时&#xff08;注意不是编译的时候&#xff09;来进行自我检查并且对内部的成员进行操作。 反射是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法…

夯实C++基础学习笔记

第一章 内存模型和编译链接 1. 掌握进程虚拟地址空间区域划分 编程语言产生&#xff1a;指令数据 exe 磁盘加载到内存&#xff0c;不可能直接加载到内存。 x86系统&#xff1a;linux系统会给当前进程分配一个 2^32 大小的空间 4G 它不存在&#xff0c;你却看得见&#xff0…

Bio-Helix丨Bio-Helix艾美捷Ponceaus S染色液说明书

Bio-Helix艾美捷Ponceaus S染色液是一种用于评估蛋白质印迹转移效率的现成膜染色剂。该染色剂适用于硝化纤维或PVDF膜上的快速可逆蛋白质染色。Ponceau S染色是可逆的&#xff0c;可以在0.1%NaOH中短时间培养去除。 图&#xff1a; Ponceau S溶液可用于评估硝化纤维和PVDF膜上的…

正点原子stm32F407学习笔记6——外部中断实验

一、GPIO与中断线的映射关系 GPIO 的管脚GPIOx.0 ~ GPIOx.15(xA,B,C,D,E&#xff0c;F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口&#xff0c;以线 0 为例&#xff1a;它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0,GPIOH.…

springcloud7:服务注册与发现总结篇

eureka总结 问题1&#xff1a;为什么使用服务注册&#xff1f; 服务越来越多&#xff0c;负责存储和管理维护服务地址 问题2&#xff1a;如何通过名称访问地址&#xff1f; 即服务中心存储的为名称地址的键值对&#xff0c;服务注册中心会通过名称来返回访问地址&#xff08;ip…

设备树属性获取,通过键获取值的相关函数实验

1.int of_property_read_u32_index(const struct device_node *np, const char *propname, u32 index, u32 *out_value) 功能&#xff1a;获取32位无符号整型的值 参数&#xff1a; np:节点结构体指针 propname:键名 index:索引号 out_value:获取到的值 返回值&#xff1a;成功…

代码随想录训练营第29天|LeetCode 491.递增子序列、46.全排列、47.全排列 II

参考 代码随想录 题目一&#xff1a;LeetCode 491.递增子序列 这个题同样涉及到去重&#xff0c;但是不能再使用子集II那题中的去重方法&#xff0c;在那个题中用下面的代码去重&#xff1a; if (i > 0 && nums[i] nums[i - 1] && !used[i - 1]){conti…

【机器学习笔记】吴恩达机器学习

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

麒麟系统上使用linuxdeployqt 编译安装

linuxdeployqt 去除git校验可以编译处理 银河麒麟V4&#xff0c;V10&#xff0c;本篇以V10记录&#xff0c;参照上一篇可安装V4、V7、V10三个版本&#xff0c;麒麟V4系自带了Qt&#xff0c;麒麟V10没有自带Qt&#xff0c;需要自己编译搭建环境。 linuxdeployqt编译&#xff08…

GlobalWebsoket.js 封装配置分析

GlobalWebsoket.js 封装配置分析前言一、 封装好的 GlobalWebsoket.js 1. GlobalWebsoket.js 二、GlobalWebsoket.js 代码分析1.GlobalWebsoket.js import 分析2.GlobalWebsoket.js 整体分析3. initWebSoket()3. getWebsoket4. sendSocketMessage三、GlobalWebsoket.js 使用分…

[附源码]Python计算机毕业设计大学生社团管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

大数据下一代变革之必研究数据湖技术Hudi原理实战双管齐下-中

文章目录核心原理数据写写操作UPSERT写流程INSERT写流程INSERT OVERWRIT写流程Key 生成策略删除策略写流程归纳数据读集成Spark使用环境准备spark-shell使用启动插入数据查询数据更新数据时间旅行查询增量查询指定时间点查询删除数据覆盖数据spark-sql使用启动创建表插入数据时…