Vue小项目(开发一个购物车)

基于Vue知识点1(点击跳转)、Vue知识点2(点击跳转)

​想要学习更多前端知识:点击Web前端专栏


接下来我们开发一个如下图所示,有最基本购物车功能的简易小项目


下面这是最基本的HTML+CSS框架!!!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实战小项目:购物车</title>

    <style>
      body {
          font-family: Arial, sans-serif;
      }
      .cart-item {
          width: 50%;
          margin-bottom: 15px;
          padding: 10px;
          border: 2px solid gray;
          border-radius: 10px;
          background-color: #ddd;
      }
      .buttons {
          margin-top: 5px;
      }
      .buttons button {
          padding: 5px 10px;
          margin-right: 5px;
          font-size: 16px;
          cursor: pointer;
          border: none;
          border-radius: 3px;
          background-color: pink;
      }
      .buttons input {
          width: 25px;
      }
      .buttons button:hover {
          background-color: yellow;
      }
      .quantity {
          font-size: 18px;
          font-weight: bold;
          margin-left: 10px;
      }
      h1, h2 {
          color: #333;
      }
  </style>
</head>
<body>
    <div id="app">
      <h1>实战小项目:购物车</h1>

    <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
    <div class="cart-item">
        <div class="buttons">
            <span>苹果 &nbsp;&nbsp;</span>
            <button>-</button>
            <span class="quantity">1&nbsp;&nbsp;</span>
            <button>+</button>
            <p>
            请输入价格:
            <input type="text"/> 元/斤 <br> 
            单价:
            1 元/斤
            </p>
        </div>
    </div>

    <!-- 提示:可以用计算属性或数据变动侦听器,跟踪商品数和单价的变化,进而求出总数和总价-->
    <h3>商品总数:  <ins> 1 </ins> 件</h3>
    <h3>商品总价:  <ins> 1 </ins> 元</h3>

    </div>

    <script type="module">
      import { createApp, reactive, computed } from './vue.esm-browser.js'
        createApp({
            setup() {

                // 1.定义属性:存储商品的(响应式)数组 

                // 2.定义方法:增加商品数

                // 3.定义方法:减少商品数

                // 4.定义方法:计算商品总数

                // 5.定义方法:计算商品总价

                // 6.暴露属性和方法
            }
        }).mount('#app');
    </script>
</body>
</html>

这时候还没有实现任何交互性的网页应用,单纯是一个静态网页,接下来看看怎么运用Vue来实现数据与视图的双向绑定,将其变成一个实用的小项目吧!


1、实现增加商品品类

 首先我们可以先定义一个 cartItems 属性,是用来存储商品的一个(响应式)数组;再通过v-for指令遍历这个数组(假设有n个品类,则生成n个商品项);并使用 {{item.name}} 插值表达式将每个商品名称渲染出来

<body>
    <div id="app">
      <h1>实战小项目:购物车</h1>

    <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
    <div class="cart-item" v-for="(item, index) in cartItems">
        <div class="buttons">
            <span>{{item.name}} &nbsp;&nbsp;</span>
            <button>-</button>
            <span class="quantity">1&nbsp;&nbsp;</span>
            <button>+</button>
            <p>
            请输入价格:
            <input type="text"/> 元/斤 <br> 
            单价:
            1 元/斤
            </p>
        </div>
    </div>
    <h3>商品总数:  <ins> 1 </ins> 件</h3>
    <h3>商品总价:  <ins> 1 </ins> 元</h3>

    </div>

    <script type="module">
      import { createApp, reactive, computed } from './vue.esm-browser.js'
        createApp({
            setup() {

                // 1.定义属性:存储商品的(响应式)数组 
                const cartItems = reactive([
                    { name: '苹果', quantity: 1, unit_price: 1 },
                    { name: '香蕉', quantity: 1, unit_price: 1 },
                    { name: '菠萝', quantity: 1, unit_price: 1 },
                    // 可以自适应添加更多商品 
                    // { name: '芒果', quantity: 1, unit_price: 1 },
                    // { name: '鸭梨', quantity: 1, unit_price: 1 },
                ]);

                // 暴露属性和方法
                return{
                    cartItems,
                }
            }
        }).mount('#app');
    </script>
</body>

这样商品品类有多少就会自动更新啦! 

2、实现商品数增加

 我们可以定义一个方法 increaseQuantity 用来增加商品数,并将这个方法绑定到 click 事件上,当这个按钮被点击时就会调用这个方法;因为按钮并不是同一个按钮,我们需要用到数组 v-for 遍历出来的 index 索引来区分每一个商品的商品数和单价,并且使用{{ }} 插值表达式将它们渲染出来

<body>
    <div id="app">
      <h1>实战小项目:购物车</h1>

    <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
    <div class="cart-item" v-for="(item, index) in cartItems">
        <div class="buttons">
            <span>{{item.name}} &nbsp;&nbsp;</span>
            <button>-</button>
            <span class="quantity">{{ cartItems[index].quantity }}&nbsp;&nbsp;</span>
            <!-- 使用v-on指令,调用方法时需要用到括弧,并传入index参数 -->
            <button v-on:click="increaseQuantity(index)">+</button>
            <p>
            请输入价格:
            <input type="text"/> 元/斤 <br> 
            单价:
            {{cartItems[index].unit_price}} 元/斤
            </p>
        </div>
    </div>
    <h3>商品总数:  <ins> 1 </ins> 件</h3>
    <h3>商品总价:  <ins> 1 </ins> 元</h3>
    </div>

    <script type="module">
      import { createApp, reactive, computed } from './vue.esm-browser.js'
        createApp({
            setup() {

                // 1.定义属性:存储商品的(响应式)数组 
                const cartItems = reactive([
                    { name: '苹果', quantity: 1, unit_price: 1 },
                    { name: '香蕉', quantity: 1, unit_price: 1 },
                    { name: '菠萝', quantity: 1, unit_price: 1 },
                    // 可以自适应添加更多商品 
                    // { name: '芒果', quantity: 1, unit_price: 1 },
                    // { name: '鸭梨', quantity: 1, unit_price: 1 },
                ]);

                // 2.定义方法:增加商品数
                const increaseQuantity = (index) => {
                    cartItems[index].quantity += 1;  
                }
                // 暴露属性和方法
                return{
                    cartItems,
                    increaseQuantity,
                }
            }
        }).mount('#app');
    </script>
</body>

这样增加商品的按钮就做好啦!

3、 实现商品数减少

 减少商品数和增加商品数差不多,只是需要注意的是商品不能减少到0,只有商品数大于1的时候才可减少;相同,我们可以定义一个方法 decreaseQuantity 用来减少商品数,并使用v-on指令将这个方法绑定到 click 事件上,当这个按钮被点击时就会调用这个方法

<body>
    <div id="app">
      <h1>实战小项目:购物车</h1>
<!--  -->
    <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
    <div class="cart-item" v-for="(item, index) in cartItems">
        <div class="buttons">
            <span>{{item.name}} &nbsp;&nbsp;</span>
            <!-- 使用v-on指令,调用方法时需要用到括弧,并传入index参数 -->
            <button v-on:click="decreaseQuantity(index)">-</button>
            <span class="quantity">{{ cartItems[index].quantity }}&nbsp;&nbsp;</span>
            <button v-on:click="increaseQuantity(index)">+</button>
            <p>
            请输入价格:
            <input type="text"/> 元/斤 <br> 
            单价:
            {{cartItems[index].unit_price}} 元/斤
            </p>
        </div>
    </div>
    <h3>商品总数:  <ins> 1 </ins> 件</h3>
    <h3>商品总价:  <ins> 1 </ins> 元</h3>

    </div>

    <script type="module">
      import { createApp, reactive, computed } from './vue.esm-browser.js'
        createApp({
            setup() {

                // 1.定义属性:存储商品的(响应式)数组 
                const cartItems = reactive([
                    { name: '苹果', quantity: 1, unit_price: 1 },
                    { name: '香蕉', quantity: 1, unit_price: 1 },
                    { name: '菠萝', quantity: 1, unit_price: 1 },
                    // 可以自适应添加更多商品 
                    // { name: '芒果', quantity: 1, unit_price: 1 },
                    // { name: '鸭梨', quantity: 1, unit_price: 1 },
                ]);

                // 2.定义方法:增加商品数
                const increaseQuantity = (index) => {
                    cartItems[index].quantity += 1;  
                }
                // 3.定义方法:减少商品数
                const decreaseQuantity = (index) => {
                    if(cartItems[index].quantity > 1){   //只有商品数大于1的时候才可减少
                        cartItems[index].quantity -= 1;
                    }
                }
                // 暴露属性和方法
                return{
                    cartItems,
                    increaseQuantity,
                    decreaseQuantity,
                }
            }
        }).mount('#app');
    </script>

 这样减少商品的按钮也做好啦!

4、计算商品总数

计算商品总数可以使用计算属性 computed定义一个方法 totalItems ,然后定义一个储存商品总数的变量,遍历cartItems,取出每个商品数量将其加进变量中,最后返回变量的值;并且使用{{ }} 插值表达式将它们渲染出来(调用计算属性 computed不需要加括弧)

<body>
    <div id="app">
      <h1>实战小项目:购物车</h1>
<!--  -->
    <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
    <div class="cart-item" v-for="(item, index) in cartItems">
        <div class="buttons">
            <span>{{item.name}} &nbsp;&nbsp;</span>
            <button v-on:click="decreaseQuantity(index)">-</button>
            <span class="quantity">{{ cartItems[index].quantity }}&nbsp;&nbsp;</span>
            <button v-on:click="increaseQuantity(index)">+</button>
            <p>
            请输入价格:
            <input type="text"/> 元/斤 <br> 
            单价:
            {{cartItems[index].unit_price}} 元/斤
            </p>
        </div>
    </div>

    <!-- 提示:可以用计算属性或数据变动侦听器,跟踪商品数和单价的变化,进而求出总数和总价-->
    <h3>商品总数:  <ins> {{totalItems}} </ins> 件</h3>
    <h3>商品总价:  <ins> 1 </ins> 元</h3>

    </div>

    <script type="module">
      import { createApp, reactive, computed } from './vue.esm-browser.js'
        createApp({
            setup() {

                // 1.定义属性:存储商品的(响应式)数组 
                const cartItems = reactive([
                    { name: '苹果', quantity: 1, unit_price: 1 },
                    { name: '香蕉', quantity: 1, unit_price: 1 },
                    { name: '菠萝', quantity: 1, unit_price: 1 },
                    // 可以自适应添加更多商品 
                    // { name: '芒果', quantity: 1, unit_price: 1 },
                    // { name: '鸭梨', quantity: 1, unit_price: 1 },
                ]);

                // 2.定义方法:增加商品数
                const increaseQuantity = (index) => {
                    cartItems[index].quantity += 1;  
                }
                // 3.定义方法:减少商品数
                const decreaseQuantity = (index) => {
                    if(cartItems[index].quantity > 1){
                        cartItems[index].quantity -= 1;
                    }
                }
                // 4.定义方法:计算商品总数
                const totalItems = computed(() => 
                    {
                    let total_items = 0;   //定义一个储存商品总数的变量
                    for(const item of cartItems){  //遍历cartItems,取出每个商品
                        total_items += item.quantity;  //将商品数量加进total_items
                    }
                    return total_items   //返回变量的值
                }
                )
                // 暴露属性和方法
                return{
                    cartItems,
                    increaseQuantity,
                    decreaseQuantity,
                    totalItems,
                }
            }
        }).mount('#app');
    </script>
</body>

 这样商品总数就能计算出来啦! 

5、计算商品总价

 计算商品总价一样可以使用计算属性 computed定义一个方法 totalMoney,然后定义一个储存商品总价的变量,遍历cartItems,取出的每个商品数量乘上每个商品单价将其加进变量中,最后返回变量的值;再使用v-model指令使每个价格的文本输入框与其单价数据双向绑定,并且使用{{ }} 插值表达式将它们渲染出来(调用计算属性 computed不需要加括弧)

<body>
    <div id="app">
      <h1>实战小项目:购物车</h1>
<!--  -->
    <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
    <div class="cart-item" v-for="(item, index) in cartItems">
        <div class="buttons">
            <span>{{item.name}} &nbsp;&nbsp;</span>
            <button v-on:click="decreaseQuantity(index)">-</button>
            <span class="quantity">{{ cartItems[index].quantity }}&nbsp;&nbsp;</span>
            <button v-on:click="increaseQuantity(index)">+</button>
            <p>
            请输入价格:
            <!-- 使用v-model指令使其双向数据绑定 -->
            <input type="text" v-model="cartItems[index].unit_price"> 元/斤 <br> 
            单价:
            {{cartItems[index].unit_price}} 元/斤
            </p>
        </div>
    </div>

    <!-- 提示:可以用计算属性或数据变动侦听器,跟踪商品数和单价的变化,进而求出总数和总价-->
    <h3>商品总数:  <ins> {{totalItems}} </ins> 件</h3>
    <h3>商品总价:  <ins> {{totalMoney}} </ins> 元</h3>

    </div>

    <script type="module">
      import { createApp, reactive, computed } from './vue.esm-browser.js'
        createApp({
            setup() {

                // 1.定义属性:存储商品的(响应式)数组 
                const cartItems = reactive([
                    { name: '苹果', quantity: 1, unit_price: 1 },
                    { name: '香蕉', quantity: 1, unit_price: 1 },
                    { name: '菠萝', quantity: 1, unit_price: 1 },
                    // 可以自适应添加更多商品 
                    // { name: '芒果', quantity: 1, unit_price: 1 },
                    // { name: '鸭梨', quantity: 1, unit_price: 1 },
                ]);

                // 2.定义方法:增加商品数
                const increaseQuantity = (index) => {
                    cartItems[index].quantity += 1;  
                }
                // 3.定义方法:减少商品数
                const decreaseQuantity = (index) => {
                    if(cartItems[index].quantity > 1){
                        cartItems[index].quantity -= 1;
                    }
                }
                // 4.定义方法:计算商品总数
                const totalItems = computed(() => 
                    {
                    let total_items = 0;   
                    for(const item of cartItems){
                        total_items += item.quantity;
                    }
                    return total_items
                }
                )
                // 5.定义方法:计算商品总价
                const totalMoney = computed(()=>
                    {
                    let total_money = 0;  //定义一个储存商品总数的变量
                    for(const money of cartItems){  //遍历cartItems,取出每个商品
                        total_money += money.unit_price*money.quantity;  //将每个商品数量乘上每个商品单价再加进变量total_money
                    }
                    return total_money   //返回变量的值
                })
                // 暴露属性和方法
                return{
                    cartItems,
                    increaseQuantity,
                    decreaseQuantity,
                    totalItems,
                    totalMoney
                }
            }
        }).mount('#app');
    </script>
</body>

这样一个简单的购物车小项目就做好啦! 

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

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

相关文章

Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件

不使用 deep 要想修改三方组件样式&#xff0c;只能添加到 scoped 之外&#xff0c;弊端是污染了全局样式&#xff0c;后续可能出现样式冲突。 <style lang"less"> .container {.el-button {background: #777; } }使用 /deep/ deprecated .container1 {/deep…

禁用达梦DEM的agent

agent占用内存较多&#xff0c;实际没什么使用&#xff0c;考虑停止agent 应该切换到root执行停止 cd /dm/dmdbms/tool/dmagent/service/ ./DmAgentService stop禁用

多维高斯分布的信息熵和KL散度计算

多维高斯分布是一种特殊的多维随机分布&#xff0c;应用非常广泛&#xff0c;很多现实问题的原始特征分布都可以看作多维高斯分布。本文以数据特征服从多维高斯分布的多分类任务这一理想场景为例&#xff0c;从理论层面分析数据特征和分类问题难度的关系注意&#xff0c;本文分…

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计

概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术&#xff0c;选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发&#xff0c;搭载了先进的勘智 K230D 芯片。 K230…

RocketMQ: Producer与Consumer 最佳实践

Producer 1 &#xff09;发送消息注意事项 1.1 一个应用尽可能用一个 Topic&#xff0c;消息子类型用 tags 来标识&#xff0c;tags 可以由应用自由设置。只有发送消息设置了tags&#xff0c;消费方在订阅消息时&#xff0c;才可以利用 tags 在 broker 做消息过滤 message.setT…

MCGSMCGS昆仑通态触摸屏

MCGS昆仑通态触摸屏应用实例详解 1目录设置 本案例讲了两个窗口的互相调用 创建工程 首先创建一个新工程 打开软件 McgsPro组态软件 菜单栏&#xff1a;文件&#xff1a;新建工程 打开工程设置窗口 HMI配置中应该是对应的不同型号的触摸屏&#xff0c; 选择一个类型&#x…

低温存储开关机问题

问题&#xff1a; 某消费电子产品在进行可靠性实验室&#xff0c;在低温-30C存储两个小时后&#xff0c;上电不开机。在常温25C时&#xff0c;开关机正常。 分析&#xff1a; 1、接串口抓log信息&#xff0c;从打印信息可以看出uboot可以起来&#xff0c;在跑kernel时&#x…

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;…

蓝桥杯每日真题 - 第23天

题目&#xff1a;&#xff08;直线&#xff09; 题目描述&#xff08;12届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目理解: 在平面直角坐标系中&#xff0c;从给定的点集中确定唯一的直线。 两点确定一条直线&#xff0c;判断两条直线是否相同&#xff0c;可通过…

战略思维:破解复杂世界的系统性智慧

在当今快速演变且错综复杂的时代背景下&#xff0c;战略思维已然成为个人、组织乃至国家在应对挑战和实现目标过程中的核心能力。它不仅是一种思考模式&#xff0c;更是一套系统且富有智慧的工具&#xff0c;助力我们在混沌的环境中精准定位方向、敏锐捕捉机遇。 一、目…

html+js实现图片的放大缩小等比缩放翻转,自动播放切换,顺逆时针旋转

效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片预览</title><sty…

postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)

一、 psycopg2简介 psycopg2库是python的一个可直接操作postgresql数据库的类库&#xff0c;是一个用于Python编程语言的PostgreSQL数据库适配器。它允许开发人员使用Python语言与PostgreSQL数据库进行交互和操作&#xff0c;不同于java&#xff0c;需要专用的一个驱动&#…

基于Java Springboot个人健康管理网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

论文概览 |《Journal of Urban Technology》2024 Vol.31 Issue.2

本次给大家整理的是《Journal of Urban Technology》杂志2024年第31卷第2期的论文的题目和摘要&#xff0c;一共包括6篇SCI论文&#xff01; 论文1 Aerial Video Surveillance in a Megacity: A Case Study in Santiago, Chile 大城市中的空中视频监控&#xff1a;智利圣地亚哥…

模型 I/O 与 LangChain 实践

模型 I/O 与 LangChain 实践 本文是《LangChain 实战课》第 4 节——模型 I/O&#xff1a;输入提示、调用模型、解析输出的一些学习笔记与总结。这篇文章将围绕模型 I/O 的基本概念、LangChain 提供的最佳实践以及如何通过 LangChain 实现高效的结构化数据处理展开。 什么是模…

【编译原理】词法、语法、语义实验流程内容梳理

编译原理实验有点难&#xff0c;但是加上ai的辅助就会很简单&#xff0c;下面梳理一下代码流程。 全代码在github仓库中&#xff0c;链接&#xff1a;NeiFeiTiii/CompilerOriginTest at Version2.0&#xff0c;感谢star一下 一、项目结构 关键内容就是里面的那几个.c和.h文件。…

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中&#xff0c;经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术&#xff0c;可以帮助我们在不同平台或环境下编写不同的代码&#xff0c;以适应不同的平…

使用ChatGPT生成和优化电子商务用户需求规格说明书

在电子商务项目开发中&#xff0c;用户需求规格说明书&#xff08;User Requirement Specification, URS&#xff09;是团队沟通与项目成功的基石。然而&#xff0c;面对复杂多变的需求&#xff0c;如何快速生成清晰、完整且具备说服力的文档&#xff1f;这正是AI工具的用武之地…

微信小程序包之加农炮游戏

微信小程序 - 气球射击游戏 项目简介 这是一个简单有趣的微信小程序射击游戏。玩家通过控制屏幕底部的加农炮&#xff0c;射击从上方降落的蓝色气球。游戏考验玩家的反应能力和瞄准技巧。 游戏规则 点击屏幕任意位置发射炮弹大炮会自动对准点击位置击中气球获得10分如果气球触…