当前位置: 首页 > news >正文

vue 简单实现购物车:商品基础信息最终的 html 文件 + 商品计数器的组件处理,实现了购物车;

购物车实现过程:

  • Ⅰ、商品购物车作业需求:
    • 1、商品购物车页面示例:
    • 2、具体需求:
  • Ⅱ、html 文件的构建:
    • 商品购物车.html
  • Ⅲ、组件文件的构建:
    • 商品购物车1.js
  • Ⅳ、小结:

Ⅰ、商品购物车作业需求:

1、商品购物车页面示例:

在这里插入图片描述

2、具体需求:


其一、至少包含两款商品,每款商品有不同的单价、起购数量和加减数量;其二、组件需提取为单独的JavaScript文件;其三、除了上述要求外,开发人员可以根据自己对“商品购物车”的理解自由发挥增加其他功能;

Ⅱ、html 文件的构建:

商品购物车.html

其一、项目的构建方式:

在这里插入图片描述

其二、代码为:


<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><script src="vue.js"></script><script src="商品购物车1.js"></script><style>/* 容器 flex布局,横向左边开始,纵向剧中,总共5个 */.v1 {/* 使用flex布局 */display: flex; /* v1容器横向排列 */flex-direction: row;/* 主轴靠左,从左边开始 */justify-content: flex-start;/* 纵轴 剧中 */align-items: center;}.myImg {width: 100px;height: 100px;}</style></head><body><div id="app"><h3>商品购物车</h3><div class="v1" v-for="(item, index) in goods"><div><img class="myImg" :src="item.goodsImg"/></div><div style="margin-left: 20px;"><p>商品名称:{{item.goodsName}}</p><p>商品介绍:{{item.goodsDes}}</p></div><div style="margin-left: 20px;"><!-- 使用过滤器对价格进行字符转换-格式化 ¥ 50.00  -->单价:{{item.goodsPrice | moneyFilter}}</div><div style="margin-left: 20px;"><!-- 父组件使用@事件名称 来接收子组件传递过来的事件 --><shop-counter @mycount="updateCount" :ind="index" :qigou="item.goodsQigou" :shuliang="item.goodsAmount"></shop-counter></div><div style="margin-left: 20px;"><!-- {{}}从data中的变量读取并显示 -->总金额:{{item.goodsPrice * item.goodsAmountNow | moneyFilter}}</div></div>			</div><script>var vm = new Vue({el: "#app",data: {goods: [ //装商品对象,每个商品有图像、名称、介绍、单价、起购数量、加减数量、总金额(单价*数量){goodsImg: 'https://img.mp.sohu.com/upload/20170525/9a27d60cbc854536aa26c690c97cf2c0_th.png',goodsName: '北京烤鸭',goodsDes: '便宜不拉肚子',goodsPrice: 5000, //数据库存储金额,都是以币种最小单位存储 方便计算不会丢失精度goodsQigou: 5,goodsAmount: 2,goodsAmountNow: 5}, {goodsImg: 'https://img.zcool.cn/community/01dd8c6051cb0511013e87f451cc96.jpg@1280w_1l_2o_100sh.jpg',goodsName: 'Dior口红',goodsDes: '好用又好看',goodsPrice: 25012,goodsQigou: 1,goodsAmount: 1,goodsAmountNow: 1}]},methods: {updateCount(e, i) {//e中包含了商品数量econsole.log("商品数量:" + e + "商品下标:" + i)//拿到了商品数量之后,我们要更新goods数组里面对应商品的goodsAmountNow值//数组想要识别其中到底是哪一个元素-下标索引this.goods[i].goodsAmountNow = e}},filters: {moneyFilter(e) {//对传递过来的价格进行转换,价格通过e来传递和接收// toFixed() JavaScript函数,可以对数字取n位小数 对数字调用toFixed()return (e / 100).toFixed(2)}}})</script></body>
</html>

其三、展示页面为:

在这里插入图片描述

Ⅲ、组件文件的构建:

商品购物车1.js

其一、代码为:


//商品计数器的组件代码Vue.component('shop-counter', {data: function() {return {count: parseInt(this.qigou), //商品数量,amount: parseInt(this.shuliang),subBtn: true,addBtn: false}},props: ['qigou', 'shuliang', 'ind'], //通过props接受父组件传递过来的数据// 1 颜色高亮 2 自动补全  3 不能换行// template: '<button></button>', //组件的HTML代码 两个按钮一个输入框// 反引号写代码 缺点1 颜色高亮 2 自动补全  但是可以换行template: `<div><!-- 商品计数器总共3个组件 -号按钮 输入框 +号按钮 --><button @click="sub" :disabled="subBtn">-</button><input v-model.number="count" style="width: 20px;text-align: center;" @keydown.up="add" v-on:keydown.down="sub"/><button @click="add" :disabled="addBtn">+</button></div>`,methods: {sub() {// 最少1个,最多9个if (this.count > this.qigou) {// 如果>1,就给减this.count = this.count - this.amount //商品数量 -1}if (this.count <= this.qigou) {this.subBtn = true //如果商品小于1,禁用-号按钮}if (this.count < 99) {this.addBtn = false //如果商品小于9,启用+号按钮}//发射  子组件向父组件发射事件,携带商品数量过去this.$emit('mycount', this.count, this.ind)},add() {// 增加商品数量// 最少1个,最多9个if (this.count < 99) {this.count = this.count + this.amount //商品数量+1}if (this.count > this.qigou) {this.subBtn = false //如果商品大于1,启用-号按钮}if (this.count >= 99) {this.addBtn = true //如果商品数量大于9,禁用+号按钮}this.$emit('mycount', this.count, this.ind)}},watch: {count() {if (this.count < this.qigou || this.count > 99 || isNaN(parseInt(this.count))) {this.count = this.qigou}}}
})

Ⅳ、小结:

其一、哪里有不对或不合适的地方,还请大佬们多多指点和交流!
其二、若有转发或引用本文章内容,请注明本博客地址(直接点击下面 url 跳转) https://blog.csdn.net/weixin_43405300,创作不易,且行且珍惜!
其三、有兴趣的话,可以多多关注这个专栏(Vue(Vue2+Vue3)面试必备专栏)(直接点击下面 url 跳转):https://blog.csdn.net/weixin_43405300/category_11525646.html?spm=1001.2014.3001.5482

http://www.lryc.cn/news/265063.html

相关文章:

  • 交叉熵损失(Cross Entropy Loss)学习笔记
  • python flask alchemy在判断None值时与flake8格式检测冲突
  • Text Intelligence - TextIn.com AI时代下的智能文档识别、处理、转换
  • 55.0/CSS 的应用(详细版)
  • 磁盘类型选择对阿里云RDS MySQL的性能影响
  • 数据结构---算法的时间复杂度
  • 后缀为.vue是什么文件
  • 前端微信小程序AES加密解密踩坑
  • 代码随想录算法训练营第五十八天| 739 每日温度 496 下一个更大元素 |
  • 配置自定义RedisTemplate 解决redis序列化java8 LocalDateTime
  • 华为---登录USG6000V防火墙---console、web、telnet、ssh方式登录
  • css图片属性,图片自适应
  • 【Python百宝箱】数据科学的黄金三角:数据挖掘和聚类
  • 【数据结构和算法】最大连续1的个数 III
  • AngularJS
  • 初级数据结构(七)——二叉树
  • 对比学习综述
  • R语言【cli】——cli_warn可以更便捷的在控制台输出警告信息
  • 从零开始创建GPTs 人人都可以编写自己的ChatGPT产品
  • 人工智能对网络安全的影响
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextInput输入框组件
  • 【C++入门到精通】互斥锁 (Mutex) C++11 [ C++入门 ]
  • 安全狗云原生安全-云甲·云原生容器安全管理系统
  • Python 学习路线:介绍、基础语法、数据结构、算法、高级主题、框架及异步编程详解
  • 基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI+Vant 电影院订票管理系统 的设计与实现
  • 轻量级购物小程序H5产品设计经典样例
  • final, finally, finalize 的区别?
  • 4.使用 Blazor 构建 Web 应用程序
  • CentOS操作学习(二)
  • OpenCV技术应用(9)— 视频的暂停播放和继续播放