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

💻博主现有专栏:

                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框架的一些核心特性,如响应式数据、计算属性、事件处理等,实现了一个简单的电影票购买功能。

🎃运行效果

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

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

相关文章

VBA学习(4):一键生成Sheet表目录

当Sheet表非常多的时候&#xff0c;一般我们会在第一张工作表中做一张目录&#xff0c;方便快速查找定位相应表格&#xff0c;以下示例将介绍如何通过宏程序一键生成目录。 效果如下&#xff1a; 参考代码如下&#xff1a; Sub SheetList()Dim sht As Worksheet, i As Long, s…

uniapp canvas生成海报

效果 封装组件&#xff0c;父组件 ref 调用 downImgUrl()函数&#xff0c;其他根据自己需求改 <template><view><view class"bgpart"><canvas class"canvas-wrap" canvas-id"canvasID" type"2d"></canvas…

GPT3.5的PPO目标函数怎么来的:From PPO to PPO-ptx

给定当前优化的大模型 π \pi π&#xff0c;以及SFT模型 π S F T \pi_{SFT} πSFT​ 原始优化目标为: max ⁡ E ( s , a ) ∼ R L [ π ( s , a ) π S F T ( s , a ) A π S F T ( s , a ) ] \max E_{(s,a)\sim RL}[\frac{\pi(s,a)}{\pi_{SFT}(s,a)}A^{\pi_{SFT}}(s,a)] m…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 03:强化你的子系统

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

windows无法完成格式化

方法. 使用CMD格式化 请将U盘连接到电脑&#xff0c;并确保电脑能够正常识别。 1. 在搜索框中输入“命令提示符”。在左侧结果中的“命令提示符”上点击右键&#xff0c;选择“以管理员身份运行”。 2. 在新窗口中&#xff0c;键入“diskpart”并按“回车”&#xff0c;然后…

如何通过小猪APP分发轻松实现Web封装APP

你有没有想过将你的网站或者Web应用变成一个真正的APP&#xff1f;这听起来可能有点复杂&#xff0c;但其实在今天的技术环境下&#xff0c;这已经变得非常简单了。特别是有了像小猪APP分发这样的工具&#xff0c;你可以轻松地将你的Web应用封装成一个APP。 为什么要将Web应用封…

Golang | Leetcode Golang题解之第164题最大间距

题目&#xff1a; 题解&#xff1a; type pair struct{ min, max int }func maximumGap(nums []int) (ans int) {n : len(nums)if n < 2 {return}minVal : min(nums...)maxVal : max(nums...)d : max(1, (maxVal-minVal)/(n-1))bucketSize : (maxVal-minVal)/d 1// 存储 (…

如何在不丢失数据的情况下解锁安卓手机密码

手机是我们生活中必不可少的工具&#xff0c;可以帮助我们与朋友和家人保持联系&#xff0c;了解最新消息&#xff0c;甚至经营我们的业务。然而&#xff0c;当我们在 Android 手机或 iPhone 上设置密码时&#xff0c;我们经常会忘记密码&#xff0c;或者根本没有设置密码。当这…

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

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

SpringBoot3整合SpringDoc实现在线接口文档

写在前面 在现目前项目开发中&#xff0c;一般都是前后端分离项目。前端小姐姐负责开发前端&#xff0c;苦逼的我们负责后端开发 事实是一个人全干&#xff0c;在这过程中编写接口文档就显得尤为重要了。然而作为一个程序员&#xff0c;最怕的莫过于自己写文档和别人不写文档…

c函数/2024/6/17

1.递归计算0--n的和 #include <stdio.h> int sum(int n);//递归求和函数 int main(int argc, const char *argv[]) {//(2)递归计算0--n的和int n0;printf("请输入n的值为:");scanf("%d",&n);printf("0--n的和为:%d",sum(n));return 0…

AI早班车

全球AI新闻速递 1.国内团队制作AI短片《凤鸣山海》亮相北京电影节 国内团队制作AI短片《凤鸣山海》亮相北京电影节“光影未来”电影科技单元。独特的中国玄幻题材&#xff0c;朱雀、玄武、白虎、青龙&#xff0c;四大神兽栩栩如生 2.字节跳动拒绝出售TikTok&#xff0c;如果败…

【数据结构初阶】--- 堆的应用:topk

堆的功能&#xff1a;topk 为什么使用topk 先举个例子&#xff0c;假如说全国有十万家奶茶店&#xff0c;我现在想找到评分前十的店铺&#xff0c;现在应该怎么实现&#xff1f; 第一想法当然是排序&#xff0c;由大到小排序好&#xff0c;前十就能拿到了。这是一种方法&…

三星(中国)投资公司线上入职测评笔试邀请数字推理语言逻辑真题题库

三星&#xff08;中国&#xff09;有限公司北京分公司 邀请您参加 SHL线上笔试 具体安排如下&#xff1a; 笔试时间&#xff1a;周三 9:00 笔试时长&#xff1a;1.5h ~ 2h 笔试内容及要求&#xff1a;数字推理限时30min&#xff1b;语言逻辑限时30min&#xff1b;性格测试不…

【机器学习】第5章 朴素贝叶斯分类器

一、概念 1.贝叶斯定理&#xff1a; &#xff08;1&#xff09;就是“某个特征”属于“某种东西”的概率&#xff0c;公式就是最下面那个公式。 2.朴素贝叶斯算法概述 &#xff08;1&#xff09;是为数不多的基于概率论的分类算法&#xff0c;即通过考虑特征概率来预测分类。 …

你对SSH协议了解吗

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

HTML静态网页成品作业(HTML+CSS)——新媒体专业介绍介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

经历的分享

我是三本计算机科学技术跨考上岸的学生&#xff0c;本科阶段技术能力并没有掌握多少&#xff0c;在选择导师时屡屡碰壁&#xff0c;我当时向许多计算机方向的导师&#xff0c;比如大数据方向,计算机视觉 迁移学习和图像处理方向的导师全都拒绝了我&#xff0c;最终学校给我分配…

SpringCloudStream原理和深入使用

简单概述 Spring Cloud Stream是一个用于构建与共享消息传递系统连接的高度可扩展的事件驱动型微服务的框架。 应用程序通过inputs或outputs来与Spring Cloud Stream中binder对象交互&#xff0c;binder对象负责与消息中间件交互。也就是说&#xff1a;Spring Cloud Stream能…

Sunny v1.3.0 官方版 (简洁且漂亮截图应用)

前言 Sunny是一款漂亮又实用的“截图&钉图”的软件&#xff0c;亦支持“屏幕识图”和“OCR”的软件。 一、下载地址 下载链接&#xff1a;http://dygod/source 点击搜索&#xff1a;Sunny 二、安装步骤 1、解压后将Sunny.exe发送到桌面快捷方式 2、启动桌面图标 3、正…