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

vue选项式写法项目案例(购物车)

一、初始化项目结构

1.初始化vite项目

npm create vite
cd vite-project
npm install

2.清理项目结构

清空App.vue

删除components目录下的HelloWorld.vue组件

3.为组件的样式启用sacc或less组件

npm i sass

4.初始化index.css全局样式

:root{font-size:12px
}

二、封装es-header组件

1.允许用户自定义title标题内容

2.允许用户自定义color文字颜色

3.允许用户自定义bgcolor背景颜色

4.允许用户自定义fsize字体大小

5.组件必须固定到页面顶部位置,高度45px,文字居中,z-index为999

<template><div class="head-container" :style="{backgroundColor:bgcolor,color:color,fontSize:fsize+'px'}">{{ title }}</div>
</template>
<script>
import bus from '../../ulits/eventBus'
export default {props:{title:{type:String,default:'es-header'},bgcolor:{type:String,default:'#007bff'},color:{type:String,default:'#fff'},fsize:{type:Number,default:'12'},}
}
</script>
<style scoped lang="scss">
.head-container{position: fixed;top:0;left: 0;width: 100%;height: 45px;text-align: center;line-height: 45px;z-index:999;
}
</style>

三、基于axios请求商品列表数据

1.安装axios

npm i axios -S

2.在main.js入口文件中导入并配置axios

import axios from 'axios'
//配置请求的根路径
axios.defaults.baseURL='http://localhost:3000'
//将axios挂载为全局的$http自定义属性
app.config.globalProperties.$http=axios

// 从vue中按需导入createApp函数,用于创建vue的实例对象
import { createApp } from 'vue'
// 导入待渲染的App组件
import App from './App.vue'
import './style.css'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from "./routers/index.js";
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import axios from 'axios'
// 创建vue的实例对象
const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)}
axios.defaults.baseURL='http://localhost:3000'
app.config.globalProperties.$http=axios
app.use(ElementPlus)
app.use(router)
// 指定vue控制的Dom区域,把App组件的模板结构渲染到指定的el区域中
app.mount('#app')

3.请求商品列表数据

四、封装es-footer组件

1.组件必须固定到页面底部位置,高度50px,内容两端贴边对其,z-index为999

2.允许用户自定义amount总价格,渲染时保留两位小数

3.允许用户自定义totalt总数量,并渲染到结算按钮中,如果要结算的商品数量为0,则禁用结算按钮

4.允许用户自定义isfull全选按钮的选中状态

5.允许用户通过自定义事件的形式,监听全选按钮选中状态的变化,并获取到最新的选中状态

<template><div class="footer-container"><div><input type="checkbox" id="custom-control-label" :checked="isfull" @change="onCheckboxChange" /><label for="custom-control-label">全选</label></div><div><span>合计:</span><span class="amount">¥{{ amount.toFixed(2)}}</span></div><el-button class="btn-settle" :disabled="total===0">结算({{total}})</el-button></div>
</template>
<script>
export default {props:{amount:{type:Number,dafault:0},total:{type:Number,dafault:0},isfull:{type:Boolean,default: false}},emits:['fullChange'],methods:{onCheckboxChange(e){this.$emit('fullChange',e.target.checked)}}
}
</script><style scoped lang="scss">
.footer-container{width: 100%;height: 50px;border-top:1px solid #ededed;background-color: #fff;position: fixed;bottom:0;left:0;padding:0 10px;display: flex;justify-content: space-between;align-items: center;input{vertical-align: middle; }.amount{color:red;}.btn-settle{min-width: 100px;height: 38px;border-radius: 19px;}
}
</style>

五、封装es-goods组件

1.实现edgoods组件的基本布局

2.封装组建的6的自定义属性id,thumb,title,price,count,checked

3.封装组件的自定义事件stateChange,允许外界 监听组件选中状态的变化

<template><div class="goods-container"><div class="left"><input type="checkbox" :id="id" :checked="checked" @change="onCheckboxChange" /><label :for="id"><img :src="thumb" alt=""></label></div><div class="right"><div class="top">{{ title }}</div><div class="bottom"><div class="price">¥{{ price.toFixed(2) }}</div><EsCounter :count="count" :min="1" @numberChange="numberChange"></EsCounter></div></div></div>
</template>
<script>
import EsCounter from './esCounter.vue'
export default {components:{EsCounter},props:{id:{type:String,default:'',require:true},thumb:{type:String,default:'',require:true},title:{type:String,default:'',require:true},price:{type:Number,default:0,require:true},count:{type:Number,default:0,require:true},checked:{type:Boolean,default:false,require:true}},emits:['stateChange','countChange'],methods:{onCheckboxChange(e){this.$emit('stateChange',e.target.id,e.target.checked)},numberChange(num){this.$emit('countChange',this.id,num)}}
}
</script><style scoped lang="scss">
.goods-container{width: 100%;padding:10px;display: flex;border:1px solid #ededed;.left{width: 110px;height: 100px;display: flex;justify-content: space-between;align-items: center;img{width: 100px;height: 100px;}input{vertical-align: middle; }}.right{padding: 10px;flex:1;display: flex;flex-direction: column;justify-content: space-around;.bottom{display: flex;justify-content: space-between;align-items: center;.price{color:red;}}}
}
</style>

六、实现合计、结算数量、全选功能

<template><div class="son"><EsHeader title="案例"></EsHeader>  <EsGoods v-for="goods in goodsList" :key="goods.id" :id="goods.id" :thumb="goods.thumb" :title="goods.title" :price="goods.price" :count="goods.count" :checked="goods.state" @stateChange="stateChange" @countChange='countChange'></EsGoods><EsFooter :isfull="isfull" :amount="amount" :total="total" @fullChange="fullChange"></EsFooter></div>
</template>
<script>
import EsHeader from './EsHeader.vue'
import EsFooter from './esFooter.vue'
import EsGoods from './EsGoods.vue'
export default {components:{EsHeader,EsGoods,EsFooter},data(){return{goodsList:[],amount:0,total:0}},methods:{async getGoodsList(){const {data:res}= await this.$http.get('/goodsList')this.goodsList = res},fullChange(flag){this.goodsList.forEach(item=>item.state =flag)},stateChange(id,checked){const findRes = this.goodsList.find((item)=>{return item.id==id;})if(findRes){findRes.state =checked;}this.isfull = this.goodsList.every(item=>item.state);},countChange(id,count){const findRes = this.goodsList.find((item)=>{return item.id==id;})if(findRes){findRes.count =count;}}},created(){this.getGoodsList()},computed:{total(){let a=0;this.goodsList.filter(item=>item.state).forEach(item=>a+=item.count)return a},amount(){let sum=0;this.goodsList.filter(item=>item.state).forEach(item=>sum+=item.count*item.price)return sum},}
}
</script><style scoped lang="scss">
.son{padding: 45px 0 50px 0;
}
</style>

七、封装es-counter组件能

1.渲染组件的基础布局

2.实现数量值得加减操作

3.处理min值

4.使用watc处理文本框输入的结果

5.封装numChange自定义事件

<template><div class="counter-contain"><button class="btn" :disabled="num===1" @click="onSubClick"> -</button><input type="number" class="counter-input" v-model.number.lazy="num" ><button class="btn"  @click="onAddClick">+</button></div>
</template>
<script>
export default {props:{count:{type:Number,default:0,require:true},min:{type:Number,default:0,require:NaN}},emits:['numberChange'],data(){return{num: this.count}},methods:{onSubClick(){if(isNaN(this.min)&& this.num-1<this.min)return;this.num--},onAddClick(){this.num++},},watch:{num:{handler(newVal,oldVal){const parseRes = parseInt(newVal);//不是数字或者小于1,强制等于1if(isNaN(parseRes) ||parseRes<1){this.num=1return}// //如果新值是小数,把转换的结果赋给numif(String(parseRes).includes('.')==-1){this.num=parseResreturn}this.$emit('numberChange',this.num)}}}
}
</script>
<style scoped lang="scss">
.counter-contain{.btn{width: 34px;
}
.counter-input{width: 36px;
}   
}</style>

相关文章:

vue选项式写法项目案例(购物车)

一、初始化项目结构 1.初始化vite项目 npm create vite cd vite-project npm install 2.清理项目结构 清空App.vue 删除components目录下的HelloWorld.vue组件 3.为组件的样式启用sacc或less组件 npm i sass4.初始化index.css全局样式 :root{font-size:12px } 二、封装…...

[Linux][进程] 认识进程

基本概念 进程是一个操作系统术语,用来管理与操作程序.在windows下打开任务管理器即可查看目前打开的所有进程 PCB 进程控制块,从代码层面来说 PCB 是进程所有属性的一个结构体,在Linux源码中PCB指的是struct task_struct. Linux环境下: 进程 task_struct 代码 …...

如何安装和注册 GitLab Runner

如何安装和注册 GitLab Runner GitLab Runner 是一个用于运行 GitLab CI/CD (Continuous Integration/Continuous Deployment) 作业。它是一个与 GitLab 配合使用的应用程序&#xff0c;可以在本地或云中运行。Runner 可以执行不同类型的作业&#xff0c;例如编译代码、运行测…...

专业学习|动态规划(概念、模型特征、解题步骤及例题)

一、引言 &#xff08;一&#xff09;从斐波那契数列引入自底向上算法 &#xff08;1&#xff09;知识讲解 &#xff08;2&#xff09;matlap实现递归 &#xff08;3&#xff09;带有备忘录的遗传算法 &#xff08;4&#xff09;matlap实现带有备忘录的递归算法 “&#xff1…...

数据结构与算法 #时间复杂度 #空间复杂度

文章目录 前言 一、算法的复杂度 二、时间复杂度 三、空间复杂度 四、例题 1、例1&#xff1a;冒泡排序 2、例2&#xff1a; 3、例3&#xff1a; 4、例4: 二分查找 5、例5: 阶乘 6、例6: 斐波那契 五、常见算法复杂度 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索&…...

【多机器人轨迹规划最优解问题】

此类应用场景通常很难有严格意义上的最优解&#xff0c;一般只能得到较优解。限制其获得最优解的主要因素如下&#xff1a; 一、问题的复杂性 多机器人系统的高维度性&#xff1a;每台机器人都有自己的位置、速度、任务等多个状态变量&#xff0c;多台机器人组合在一起使得问…...

机器学习及其应用领域【金融领域】

机器学习及其应用领域【金融领域】 一、智能投顾与资产配置二、信贷审批与风险评估三、支付与交易安全四、金融欺诈检测五、市场预测与情绪分析六、客户服务与个性化推荐七、面临的挑战与未来趋势八、总结 一、智能投顾与资产配置 智能投顾&#xff1a;通过机器学习技术&#…...

【实战教程】PHP与七牛云的完美对接,你值得拥有!

前言&#xff1a; 随着互联网的迅速发展&#xff0c;越来越多的网站和应用程序需要处理大量的图片、视频和其他文件。为了有效地存储和管理这些文件&#xff0c;并提供快速的内容分发服务&#xff0c;开发者们常常依赖于云存储和CDN服务提供商。 七牛云是一家领先的云存储和CD…...

2024网易低代码大赛 | 想参赛但不知道搭什么?灵感就这么水灵灵地来了!

9月6日-10月15日&#xff0c;报名进行时&#xff01;戳我即可报名&#xff01; 如果你还没想好要开发什么作品来参赛&#xff0c;那就必须往下 我们采访了n位网易内部人士&#xff0c;搜罗了他们的建议&#xff0c;给你多一些灵感&#xff01; 注意&#xff1a;下文仅为本次比赛…...

(附源码)基于django的电力工程作业现场物资管理系统的设计与实现-计算机毕设 22067

基于django的电力工程作业现场物资管理系统的设计与实现 摘 要 随着电力工程的快速发展&#xff0c;作业现场物资管理成为保障工程进度和质量的关键环节。本文旨在设计并实现一个基于Django框架的电力工程作业现场物资管理系统&#xff0c;以提高物资管理的效率和准确性。该系统…...

数据链路层协议 —— 以太网协议

目录 1.数据链路层解决的问题 2.局域网通信方式 以太网 令牌环网 无线局域网 3.以太网协议 以太网帧格式 对比理解Mac地址和IP地址 认识MTU MTU对IP协议的影响 MTU对UDP的影响 MTU对TCP的影响 基于以太网协议的报文转发流程 交换机的工作原理 4.ARP协议 ARP协议…...

【Javascript】一文看懂JS中的symbol到底是什么东西

作为一名经验丰富的 JavaScript 开发者&#xff0c;你可能对 JavaScript 中的各种数据类型已经了如指掌&#xff0c;比如数字、字符串、布尔值和对象。但是你知道吗&#xff1f;JavaScript 还有一种叫做 Symbol 的类型。在这篇文章里&#xff0c;我们将深入探讨 Symbol 的世界&…...

go语言网络编程

网络编程Go语言网络编程相关APIGo语言网络编程架构Go语言的网络编程实现基于以下几个关键原理&#xff1a;bufiobufio 包的主要功能和使用场景主要类型示例 tcp通信解决粘包粘包和拆包的产生原因解决方法示例 网络编程 Go语言网络编程相关API 1.1 net包net.Listen(network, a…...

LeetcodeLCR 116. 省份数量

文章目录 题目原题链接思路C代码 题目 原题链接 LCR 116. 省份数量 思路 利用并查集的思想&#xff0c;将连接的诚实放在一个集合当中&#xff0c;最后遍历并查集数组判断有几颗树 初始化一个并查集&#xff1b;将连通的城市合并&#xff1b;统计并查集中树的个数&#xff1b…...

Linux系统上搭建Vulhub靶场

Linux系统上搭建Vulhub靶场 ​vulhub​ 是一个开源的漏洞靶场&#xff0c;它提供了各种易受攻击的服务和应用程序&#xff0c;供安全研究人员和学习者测试和练习。要在 Linux 系统上安装和运行 vulhub​&#xff0c;可以按照以下步骤进行&#xff1a; 1. 安装 Docker 和 Docke…...

Avalonia的第三方UI库SukiUI详细教程

文章目录 一、SukiUI 简介二、安装与配置1、安装 SukiUI 库:2、配置 Avalonia 项目以使用 SukiUI:三、基本组件使用1、按钮(SukiButton):2、文本框(SukiTextBox):3、标签(SukiLabel):4、下拉列表(SukiComboBox):四、布局与容器1、布局容器介绍:2、使用布局容器组…...

https协议文件上传比http协议慢

一.自己写一个文件上传的接口&#xff0c;在浏览器文件上传https协议比http协议慢&#xff08;速度上https协议是http协议的八分之一左右&#xff09;&#xff0c;在postman上传是正常的&#xff08;证明代码是没有问题的&#xff09;&#xff0c;那就是协议的问题 二.经发现&…...

Elasticsearch在大数据处理中的优势

Elasticsearch 在大数据处理中的优势主要体现在以下几个方面&#xff1a; 1. 分布式架构 水平扩展&#xff1a;Elasticsearch 设计为分布式系统&#xff0c;可以轻松地通过增加节点来水平扩展&#xff0c;处理 PB 级别的数据。数据分片和复制&#xff1a;数据自动分片并跨多个…...

cmake--target_compile_definitions

作用 笼统的说是&#xff1a;该命令添加预编译选项到编译目标中。 预编译选项 预编译选项&#xff08;Preprocessor Options&#xff09;是一类用于控制 C/C 预处理器行为的编译选项。预处理器是 C/C 编译过程中的第一个处理阶段&#xff0c;主要负责对源代码中的预处理指令…...

MATLAB数据文件读写:1.格式化读写文件

格式化读写文件 matlab提供了对数据文件建立、打开、读取、写入、关闭等操作的函数。 数据文件可以分为两类&#xff1a; 文本文件&#xff1a;以ASCII码形式存储的文本文件&#xff1b;编码基于字符定长&#xff0c;译码相对容易二进制文件&#xff1a;以二进制形式存储的文…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...