【Vue】——组件的注册与引用(二)

news2024/10/7 20:32:35

💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,设计模式、Python机器学习等
🥏主页链接:

                Y小夜-CSDN博客

目录

🎯本文目的

🎯实现一个“购物车”

🎃要求

🎃代码解析

🎃运行效果

🎯影院订票系统前端页面

🎃要求

🎃代码解析

🎃运行效果


学习推荐:

        人工智能是一个涉及数学、计算机科学、数据科学、机器学习、神经网络等多个领域的交叉学科,其学习曲线相对陡峭,对初学者来说可能会有一定的挑战性。幸运的是,随着互联网教育资源的丰富,现在有大量优秀的在线平台和网站提供了丰富的人工智能学习材料,包括视频教程、互动课程、实战项目等,这些资源无疑为学习者打开了一扇通往人工智能世界的大门。

        前些天发现了一个巨牛的人工智能学习网站:前言 – 人工智能教程通俗易懂,风趣幽默,忍不住分享一下给大家。

🎯本文目的

(一)掌握vue项目中组件的注册与引用;

(二)通过综合案例掌握vue的基本语法。

🎯实现一个“购物车”

🎃要求

要求:1、单击“+”“-”按钮对应数量可以改变,相应的合计、总价也要重新计算。

      2、当某个商品数量为0时,其“-”按钮为不可用状态。

🎃代码解析

<template>
    <h1 style="text-align: center;">软工</h1>
    <table border="1" align="center" width="400px">
      <caption><h2>购物车</h2></caption>
      <tr align="center" >
        <td>名称</td>
        <td>单价</td>
        <td>数量</td>
        <td>合计</td>
      </tr>
      <tr align="center" v-for="(item,index) in list" :key="item.id">
        <td>{{item.name}}</td>
        <td>{{item.price}}</td>
        <td >
          <button @click="sub(index)" :disabled="item.count==0?true:false">-</button>
          {{item.count}}
          <button @click="add(index)">+</button>
        </td>
        <td>{{item.price*item.count}}</td>
      </tr>
      <tr align="center" >
        <td>总价</td>
        <td  colspan="3" >{{ computedname }}</td>
      </tr>
    </table>
  </template>

  <script setup>
  import { computed, reactive,} from 'vue'
      const list = reactive([
          {id:1,name: '华为mate30',price: 4566,count: 2},
          {id:2,name: '华为mate40',price: 4166,count: 3},
          {id:3,name: '苹果X',price: 5200,count: 2},
          {id:4,name: 'OPPO',price: 2180,count: 4}
        ])
        const sub = (index)=>{
            if(list[index].count>0){
                list[index].count--
            }
        }
        const add = (index)=>{
            list[index].count++
        }
        const computedname = computed(()=>{
            let prices = 0
            list.forEach((item)=>{
                prices += item.price * item.count
            })
            return prices
        })
  </script>

        这段代码是一个使用Vue.js框架编写的购物车页面。它包含了一个表格,用于展示商品的名称、单价、数量和合计。用户可以通过点击"+"和"-"按钮来增加或减少商品的数量。同时,表格下方显示了商品的总价。

代码的主要部分包括:

1. HTML模板:定义了一个包含标题和表格的HTML结构。表格中的每一行都使用`v-for`指令遍历`list`数组,动态生成商品信息。每一行的最后一个单元格使用了计算属性`computedname`来计算该行的合计金额。

2. Vue.js组件:使用Vue.js的`reactive`函数创建了一个响应式的数据对象`list`,其中包含了商品的信息(名称、单价、数量)。

3. 方法:定义了两个方法`sub`和`add`,分别用于减少和增加商品的数量。这两个方法通过传入商品的索引来实现对特定商品的操作。

4. 计算属性:使用Vue.js的`computed`函数创建了一个计算属性`computedname`,用于计算所有商品的总价。它通过遍历`list`数组,将每个商品的价格乘以数量,并将结果累加到变量`prices`中。最后返回`prices`作为总价。

        这段代码的功能是实现了一个简单的购物车页面,用户可以查看商品信息、修改商品数量以及计算总价。

🎃运行效果

🎯影院订票系统前端页面

🎃要求

要求:1、掌握Vue的基本语法。

      2、一次最多能购买五张电影票。

      3、显示购买电影票的位置、单价、总价。

      4、可选电影票、选中电影票、售过电影票要有图形颜色或样式区别。

      5、要能使用图形方式进行电影座位的选择。

🎃代码解析

<template>
    <h1>软工</h1>
    <div class="film">
      <!--电影购票左边  -->
      <div class="filmLeft">
        <h3>屏幕</h3>
        <ul>
          <li v-for="(item, index) in seatflag" :key="index" class="seat" :class="{
            noSeat: seatflag[index] == -1,
            seatSpace: seatflag[index] == 0,
            seatActive: seatflag[index] == 1,
            seatNoUse: seatflag[index] == 2,
          }" @click="handleClick(index)"></li>
        </ul>
      </div>
       <!-- 电影购票右边 -->
    <div class="filmRight">
      <div class="rightTop">
        <div class="rightTopleft">
          <a href="#">
            <img :src="filmInfo.filmImg" alt="..." height="200" />
          </a>
        </div>
        <div class="rightTopRight">
          <p>
            中文名:<strong>{{ filmInfo.name }}</strong>
          </p>
          <p>英文名:{{ filmInfo.nameEnglish }}</p>
          <p>剧情:{{ filmInfo.storyType }}</p>
          <p>版本:{{ filmInfo.copyRight }}</p>
          <p>{{ filmInfo.place }} / {{ filmInfo.timeLength }}</p>
          <p>{{ filmInfo.timeShow }}</p>
        </div>
      </div>

      <div class="rightBootom">
        <p>影院:<strong>{{ filmInfo.cinema }}</strong> </p>
        <p>影厅:<strong>{{ filmInfo.room }}</strong></p>
        <p>场次:<strong>{{ filmInfo.time }}</strong></p>
        <p id="seatSelect">
          座位:<span v-for="(item, index) in userFilmMsg.curSeatDisp" :key="index">{{
            item+" "
          }}</span>
        </p>
        <p>
          已选择<strong style="color: red">{{ userFilmMsg.count }}</strong>个座位,<strong style="color: red">再次单击座位可取消。
            <span v-if="userFilmMsg.maxFlag">您一次最多只能买五张票!</span></strong>
        </p>
        <hr />
        <p>
          单价:<strong>{{ numberFormat(filmInfo.unitPrice) }}</strong>
        </p>
        <p>
          总价:<strong style="color: red">{{numberFormat(fileTotal)}}</strong>
        </p>
        <hr />
        <button type="button" class="btn" @click="filmSubmit">确认下单</button>
 </div>

    </div>

    </div>

  </template>
  
  <script setup>
  import { reactive} from "vue";
  const seatflag = reactive(//0表示空座,-1表示没有座位,1表示被选中座位,2表示已购买座位
    [
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0,
      2, 2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0,
      -1, -1,
    ]
  )
  const filmInfo = reactive({
  name: "囧妈",
  nameEnglish: "Lost in Russia",
  copyRight: "中文2D",
  filmImg: '/src/assets/film1.png',
  storyType: "喜剧",
  place: "中国大陆",
  timeLength: "126分钟",
  timeShow: "2020.02",
  cinema: "万达影城",
  room: "8号影厅",
  time: "2021.05.18(周二)20:00",
  unitPrice: 38,
})
import {computed} from "vue"
const userFilmMsg = reactive({
  curSeat: [],
  curSeatDisp: [],
  count: 0,
  maxLength: 5,
  maxFlag: false,
  seatCol: 10,
}) 
// 数据格式化方法
 const numberFormat = (value) => "¥" + value.toFixed(2);

// 计算属性计算总票价
const fileTotal = computed(() => {
  return userFilmMsg.count * filmInfo.unitPrice;
});
// 单击座位事件处理方法
const handleClick = (index) => {
      if (seatflag[index] === 1) {
        seatflag[index] = 0;
        userFilmMsg.curSeat.splice(
          userFilmMsg.curSeat.findIndex((item) => item === index),
          1
        );
      } else {
        // 判断单击座位是否是可选座位并且选中座位数小于5
        if (seatflag[index] === 0 && userFilmMsg.curSeat.length < 5) {
          seatflag[index] = 1;
          userFilmMsg.curSeat.push(index);  //将选中座位的下标进行存储
        }
      }
      // 设置当前选中的座位
      userFilmMsg.curSeatDisp = [];
      for (const data of userFilmMsg.curSeat) {
        userFilmMsg.curSeatDisp.push(
          Math.floor(data / userFilmMsg.seatCol) +1 +"行" +((data % userFilmMsg.seatCol) + 1) +"列");
      }
      // 计数已经选择了多少个座位
      var mySeat = seatflag.filter((item) => item === 1);
      userFilmMsg.count = mySeat.length;
      // 判断达到购买上限
      if (userFilmMsg.count >= 5) userFilmMsg.maxFlag = true;
      else userFilmMsg.maxFlag = false;
    }
    // “确认提交”按钮
    const filmSubmit=()=>{
      var flag=confirm("确认提交吗?")
      if(flag)  alert("已提交!")
}

  </script>
  
  <style scoped>
  h1 {
    text-align: center;
  }
  
  .film {
    margin: 0 auto;
    width: 1050px;
    border: 1px solid grey;
    height: 550px;
  }
  
  .filmLeft {
    width: 550px;
    height: 500px;
    float: left;
  }
  
  .filmLeft h3 {
    text-align: center;
  }
  
  .filmLeft ul li {
    list-style: none;
  }
  
  .seat {
    float: left;
    width: 30px;
    height: 30px;
    background-color: bisque;
    margin: 5px 10px;
    cursor: pointer;
  }
  
  .seatNotice {
    float: left;
    width: 30px;
    height: 30px;
    margin: 5px 10px;
    background-color: bisque;
    list-style: none;
    margin-left: 50px;
  }
  
  .notice {
    float: left;
    height: 30px;
    line-height: 30px;
  }
  /* 空位置 */
  .seatSpace {
    background: url("/src/assets/bg.png")no-repeat 1px -29px;
  }
  /* 被选中座位 */
  .seatActive {
    background: url("/src/assets/bg.png") 1px 0px;
  }
  /* 已经购买座位 */
  .seatNoUse {
    background: url("/src/assets/bg.png") 1px -56px;
  }
  /* 没有位置 */
  .noSeat {
    background: url("/src/assets/bg.png") 1px -84px;
  }
  .filmRight {
  width: 500px;
  height: 580px;
  float: left;
  background-color: bisque;
}

.rightTopleft {
  float: left;
  margin: 20px 15px 5px 10px;
}

.rightTopRight {
  text-align: center;
  float: left;
  margin: 0px 0px 5px 5px;
}

.rightBootom {
  text-align: center;
  clear: both;
  margin: 0px 10px;
}

#filmInformation,
#filmRightTopLeft {
  float: left;
}

#filmRightBottom {
  clear: both;
}
.btn{
  margin-top: 8px;
  color: #fff;
  background-color: cadetblue;
  border: none;
  padding: 5px 10px;
}

  </style>
  

        这段代码是一个Vue.js应用程序,用于实现电影购票功能。它包括一个电影票购买页面,用户可以在页面上选择座位并提交订单。

代码的主要结构如下:

1. 引入Vue.js库和相关依赖。
2. 定义了一个名为`seatflag`的响应式数组,用于存储座位的状态(0表示空座,-1表示没有座位,1表示被选中座位,2表示已购买座位)。
3. 定义了一个名为`filmInfo`的响应式对象,用于存储电影信息(名称、英文名称、版权、图片、剧情类型、地点、时长、放映时间、票价等)。
4. 定义了一个名为`userFilmMsg`的响应式对象,用于存储用户选择的座位信息(当前选中的座位、显示的座位、计数、最大长度、是否达到购买上限等)。
5. 定义了一个名为`numberFormat`的函数,用于将票价格式化为带有货币符号的形式。
6. 定义了一个名为`fileTotal`的计算属性,用于计算总票价。
7. 定义了一个名为`handleClick`的事件处理方法,用于处理用户点击座位的事件。
8. 定义了一个名为`filmSubmit`的方法,用于处理用户点击“确认提交”按钮的事件。
9. 使用`<template>`标签定义了HTML模板结构,包括电影票购买页面的布局和样式。
10. 使用`<style>`标签定义了CSS样式,用于美化页面。

代码的功能如下:

1. 用户可以通过点击座位来选择或取消选择座位。
2. 用户可以选择最多5个座位。
3. 当用户选择座位时,会实时更新已选座位的数量和总票价。
4. 用户点击“确认提交”按钮后,会弹出确认框,如果用户确认提交,则显示“已提交!”的提示信息。

        这段代码使用了Vue.js框架的一些核心特性,如响应式数据、计算属性、事件处理等,实现了一个简单的电影票购买功能。

🎃运行效果

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

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

相关文章

软件加密的基本概念

软件加密作为信息安全领域的一项重要技术&#xff0c;随着数字化时代的到来&#xff0c;其重要性日益凸显。以下是关于软件加密的详细解析&#xff0c;旨在为读者提供全面且深入的了解。 一、软件加密的基本概念 软件加密&#xff0c;简而言之&#xff0c;就是在数据传输、存储…

在windows 台式机电脑部署GLM4大模型

参考这篇文章在windows笔记本电脑部署GLM4大模型_16g显卡本地部署glm4-CSDN博客 我的环境&#xff08;PC台式机电脑&#xff1a; 处理器 Intel(R) Core(TM) i9-14900K 3.20 GHz 机带 RAM 32.0 GB (31.8 GB 可用)、32G内存、NVIDIA RTX4080&#xff08;16G&#xff09;…

使用 ZTM 增强极空间 NAS 的远程访问能力

入手极空间 Z4Pro 快两个周了&#xff0c;使用体验文章还得再等一等&#xff0c;多一些深度体验的时间。到目前来看&#xff0c;还是很满意的。 背景 今天这篇来说说极空间的远程访问功能&#xff0c;产品页面对远程访问的描述是&#xff1a; 让极空间真正成为你家庭中的网络…

6.17 作业

使用qt实现优化自己的登录界面 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 第一个源文件 …

Mybatis --- 动态SQL 和数据库连接池

文章目录 一、什么是动态SQL 重要性二、动态SQL的编写 ---注解三、动态SQL的编写 ---xml3.1 增加场景 if标签3.2 处理代码块内容 --- trim 标签3.3 查询场景 where标签3.4 更新场景 set标签3.5 删除场景 <foreach> 循环标签3.6 include、sql标签 代码重复度问题 四、数据…

vue+element-plus完美实现跨境电商商城网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.中英文样式切换 4.金钱类型切换 5.商品详情 6.购物车 7.登录 ​编辑 8.注册 9.个人中心 三、源码实现 1.项目依赖package.json 2.项目启动 3.购物车页面 四、总结 一、项目介绍 本项目在线预览&am…

Matlab基础篇:绘图与可视化

目录 前言 一、二维绘图 二、图形属性设置 三、多图绘制 四、三维绘图 五、绘图技巧 六、绘图的高级技巧 七、实例示范&#xff1a;绘制多功能图形 八、总结 前言 在数据分析和数学建模中&#xff0c;可视化是一个非常关键的步骤。Matlab 提供了丰富的绘图和可视化工…

自主可控数据库沙龙(北京站 |线下| 报名中)

**数据库沙龙**是一个致力于推动数据库技术创新和发展的高端交流平台&#xff0c;旨在增强国内数据库产业的自主可控性和高质量发展。这个平台汇集了学术界和产业界的顶尖专家、学者以及技术爱好者&#xff0c;通过专题演讲、案例分享和技术研讨等丰富多样的活动形式&#xff0…

6月17日(周一)美国股市行情总结:标普纳指齐新高,AI和芯片股尤为出色

标普500指数在六天里第五天上涨&#xff0c;纳指和纳指100均连续六日新高&#xff0c;道指止步四日连跌脱离近两周低位&#xff0c;罗素小盘股指止步两日连跌并脱离六周最低。微软收盘市值仍为美股第一、苹果为第二、英伟达第三&#xff0c;但早盘触及盘中新高的英伟达市值曾超…

你对SSH协议了解吗

SSH&#xff08;Secure Shell&#xff09;协议&#xff0c;作为网络通信领域的一项核心技术&#xff0c;以其卓越的安全性能和广泛的应用范围&#xff0c;成为保障网络通信安全的重要工具。本文将深入剖析SSH协议的工作原理、核心特性以及在现代网络通信中的关键作用&#xff0…

上海亚商投顾:沪指缩量调整 PCB概念股持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化&#xff0c;沪指全天震荡调整&#xff0c;创业板指午后涨超1%。消费电子板块全天强势&a…

安卓多媒体(音频录播、传统摄制、增强摄制)

本章介绍App开发常用的一些多媒体处理技术&#xff0c;主要包括&#xff1a;如何录制和播放音频&#xff0c;如何使用传统相机拍照和录像&#xff0c;如何截取视频画面&#xff0c;如何使用增强相机拍照和录像。 音频录播 本节介绍Android对音频的录播操作&#xff0c;内容包…

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理&#xff0c;以及GTX IP实现64B66B编解码的相关信号组成&#xff0c;本文生成64B66B编码的GTX IP。 首先如下图所示&#xff0c;需要对GTX共享逻辑进行设置&#xff0c;为了便于扩展&a…

Apple - Framework Programming Guide

本文翻译自&#xff1a;Framework Programming Guide&#xff08;更新日期&#xff1a;2013-09-17 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183i 文章目录 一、框架编程指南简介…

文件操作(1)(C语言版)

前言&#xff1a; 为什么要学习文件操作&#xff1a; 1、如果大家写过一些代码&#xff0c;当运行结束的时候&#xff0c;这些运行结果将不复存在&#xff0c;除非&#xff0c;再次运行时这些结果才能展现在屏幕上面&#xff0c;就比如之前写过的通讯录。 现实中的通讯录可以保…

商超智能守护:AI监控技术在零售安全中的应用

结合思通数科大模型的图像处理、图像识别、目标检测和知识图谱技术&#xff0c;以下是详细的商超合规监测应用场景描述&#xff1a; 1. 员工仪容仪表监测&#xff1a; 利用图像识别技术&#xff0c;系统可以自动检测员工是否按照规范整理妆容、穿着工作服&#xff0c;以及是否…

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮 科技行业高管和专家表示&#xff0c;两大科技巨头之间长达两年的法律大战可能会扰乱人工智能驱动的新一代个人电脑浪潮。 上周&#xff0c;来自微软(Microsoft)、华硕(Asus)、宏碁(Acer)、高通(Qualcomm)等公司的高管在台北举行…

Raylib的贪吃蛇

配置Raylib库 工具链主函数模板Draw: 绘制网格Snake: 初始化Draw&#xff1a;绘制蛇与果Input&#xff1a;移动Logic&#xff1a;游戏主要逻辑Draw: 游戏结束 工具链 mkdir snake cd snakeCMakeLists.txt cmake_minimum_required(VERSION 3.10) project(snake) set(CMAKE_EXP…

深度学习500问——Chapter11:迁移学习(3)

文章目录 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 11.3.2 边缘分布自适应 11.3.3 条件分布自适应 11.3.4 联合分布自适应 11.3.5 概率分布自适应方法优劣性比较 11.3.6 特征选择 11.3.7 统计特征对齐方法 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 数据分布自适…

libdrm 2.4.107 needed because amdgpu has the highest requirement

libdrm 2.4.107 needed because amdgpu has the highest requirement 1.问题分析解决 1.问题 Message: libdrm 2.4.107 needed because amdgpu has the highest requirement Run-time dependency libdrm_intel found: YES 2.4.107 Run-time dependency libdrm_amdgpu found: Y…