Vue+Element+computed实现购物车
本人写的小程序,功能还在完善中,欢迎扫一扫提出宝贵意见!

该购物车效果采用的是Element-ui库实现的。
采用了computed计算属性来实现逻辑操作。
功能分析:
- 全选/全不选/单选。
- 数量增加、数量减少。
- 总金额=数量*单价。
- 商品总价:每一项的总金额相加。
- 商品总数:每一项的数量相加。
- 删除功能。
废话不多说,复制粘贴看效果:
<template>
<div class="cart">
<div class="group_btn">
<el-button type="success" @click="addDialog">添加</el-button>
</div>
<el-table
:data="tableData"
border
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column type="index" label="序号" width="180" align="center"></el-table-column>
<el-table-column prop="name" label="类目" width="180" align="center"></el-table-column>
<el-table-column prop="price" label="价格" align="center"></el-table-column>
<el-table-column label="数量" align="center">
<template slot-scope="scope">
<el-input-number v-model="scope.row.number" :min="1" :max="10" label="描述文字"></el-input-number>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" @click="editDialog(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="total_warpper">
<h3>共计:{{totalPrice}}</h3>
<h3>总数:{{totalNumber}}</h3>
</div>
<!-- 添加弹窗的内容 -->
<el-dialog title="添加信息" :visible.sync="addIsDialog" class="addDialog">
<el-form :model="formData">
<el-form-item label="类目" :label-width="formLabelWidth">
<el-input v-model="formData.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="价格" :label-width="formLabelWidth">
<el-input v-model="formData.price" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="数量" :label-width="formLabelWidth">
<el-input v-model="formData.number" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addIsDialog = false">取 消</el-button>
<el-button type="primary" @click="addSureBtn">确 定</el-button>
</div>
</el-dialog>
<!-- 添加编辑的内容 -->
<el-dialog title="添加信息" :visible.sync="editIsDialog" class="addDialog">
<el-form :model="editData">
<el-form-item label="类目" :label-width="formLabelWidth">
<el-input v-model="editData.name" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="价格" :label-width="formLabelWidth">
<el-input v-model="editData.price" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="数量" :label-width="formLabelWidth">
<el-input v-model="editData.number" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="editIsDialog = false">取 消</el-button>
<el-button type="primary" @click="editSureBtn">确 定</el-button>
</div>
</el-dialog>
</div>
</template> <script>
export default {
data() {
return {
editIsDialog: false, //编辑弹窗
addIsDialog: false, //添加弹窗
multipleSelection: [], //存放已选择的数据
formData: {
name: "",
price: "",
number: ""
},
editData: {},
formLabelWidth: "200",
//表格中的数据
tableData: [
{
name: "苹果",
price: 10,
number: 1
},
{
name: "香蕉",
price: 20,
number: 1
},
{
name: "草莓",
price: 5,
number: 1
}
]
};
},
methods: {
// 点击发生的变化
handleSelectionChange(val) {
this.multipleSelection = val; //给定义的数组赋值
},
handleDelete(index, row) {
this.tableData.splice(index, 1); //删除表格的数据
},
// 点击弹出添加弹窗
addDialog() {
this.addIsDialog = true;
},
// 点击添加弹窗的确定按钮
addSureBtn() {
this.addIsDialog = false;
this.tableData.push(this.formData);
// 初始化添加表单
this.formData = {
name: "",
age: "",
sex: ""
};
},
// 点击弹出添加弹窗
editDialog(index, row) {
this.editIsDialog = true;
this.editData = row;
},
editSureBtn(row, index) {
this.editIsDialog = false;
}
},
// 通过computed计算属性及时改变
computed: {
// 总价
totalPrice() {
var price_total = 0;
for (var i = 0; i < this.multipleSelection.length; i++) {
price_total +=
this.multipleSelection[i].price * this.multipleSelection[i].number;
}
return price_total;
},
// 总数
totalNumber() {
var number_total = 0;
for (var i = 0; i < this.multipleSelection.length; i++) {
number_total += this.multipleSelection[i].number;
}
return number_total;
}
},
components: {}
};
</script> <style scoped>
.cart {
margin: 50px auto;
width: 1000px;
}
.group_btn {
margin-bottom: 30px;
}
.addDialog .el-input {
width: 90%;
}
.total_warpper {
text-align: right;
margin-top: 30px;
}
h3 {
margin-top: 10px;
}
</style>
若有不明白请加群号:复制 695182980 ,也可扫码,希望能帮助到大家。
Vue+Element+computed实现购物车的更多相关文章
- 前端小菜鸡使用Vue+Element笔记(一)
关于使用Vue+Element的项目简介~ 最近因为项目组缺前端人员,所以自己现学现做页面,先把前后台功能调通 觉得前端可真的是不容易呀哎呀~ 首先记录一下相关的Vue入门的教程: vue环境搭建示例 ...
- vue+element ui 的上传文件使用组件
前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...
- (vue.js)Vue element tab 每个tab用一个路由来管理?
(vue.js)Vue element tab 每个tab用一个路由来管理? 来源:网络整理 时间:2017/5/13 0:24:01 关键词: 关于网友提出的“ (vue.js) ...
- Vue Element使用第三库icon图标
一:引入单设图标 1.打开 阿里icon,注册 >登录>图标管理>我的项目 2.新建项目 返回阿里icon首页,点进去你想要的icon库,因为没有批量导入购物车,所以一般情况下需要一 ...
- Vue Element 使用 icon 图标 (第三方)
Vue Element 使用 icon 图标 (第三方) element-ui 自带的图标库还是不够全, 还是需要需要引入第三方 icon, 自己在用的时候一直有些问题, 参考了些教程, 详细地记录补 ...
- 循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
在前面随笔<循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理>中介绍了在Vue + Element整合框架中,实现了动态菜单和动态路由的处理,从而可以根据 ...
- 循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用
在VUE+Element 前端应用中,图标是必不可少点缀界面的元素,因此整合一些常用的图标是非常必要的,还好Element界面组件里面提供了很多常见的图标,不过数量不是很多,应该是300个左右吧,因此 ...
- 封装Vue Element的form表单组件
前两天封装了一个基于vue和Element的table表格组件,阅读的人还是很多的,看来大家都是很认同组件化.高复用这种开发模式的,毕竟开发效率高,代码优雅,逼格高嘛.虽然这两天我的心情很糟糕,就像& ...
- 封装Vue Element的可编辑table表格组件
前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...
随机推荐
- 【转】Windons+jenkins,构建java程序,提示C:\Windows\TEMP\jenkins5037773887088486383.bat Access is denied
坑1: !!!前提:已设置本机电脑的账号密码, 解决方法:搜索程序services.msc-- 找到Jenkins-- 右键“属性”--登录--此账户--输入本机的账号密码--保存-- 停止Jenki ...
- TTL集成门电路
一.TTL集成门电路的结构1.总体结构 所谓TTL就是transistor transistor logic,就是说是由晶体管和晶体管之间构成电路. 2. TTL集成门电路典型输入级形式 1)二 ...
- java爬取免费HTTP代理 code-for-fun
偶然看到一个提供免费HTTP 代理IP的网站,该网站一两个小时就会更新一次,很有用.之后自己就用Java写了一个爬虫,爬取网站上的代理IP,以备后用. 网站源码: <!DOCTYPE html& ...
- JVM内存回收机制——哪些内存需要被回收(JVM学习系列2)
上一篇文章中讨论了Java内存运行时的各个区域,其中程序计数器.虚拟机栈.本地方法栈随线程生灭,且创建时需要多少内存,基本上在译期间就决定的了,所以在内存回收时无需特殊的关注.而堆和方法区则不同,首先 ...
- 解决ssh连接问题1
某天服务器A与B,互相ping没问题,telnet 22端口没问题 ssh -v a@10.80.97.241 OpenSSH_6.6.1, OpenSSL 1.0.1k-fips 8 Jan 201 ...
- was系统的远程调试
1.进入websphere页面 2.servers->server types->websphere application servers->点击Additional Proper ...
- 3.JAVA基础复习——JAVA中的类与对象
什么是对象: 就是现实中真实的实体,对象与实体是一一对应的,现实中每一个实体都是一个对象在. JAVA中的对象: Java中通过new关键字来创建对象. 类: 用JAVA语言对现实生活中的事物进行描述 ...
- 编译原理 #03# 龙书中缀转后缀JS实现版
// 来自龙书第2章2.5小节-简单表达式的翻译器 笔记 既然是语法制导翻译(Syntax-directed translation),那么最重要的东西当然是描述该语言语法的文法,以下为中缀表达式文法 ...
- JSON.parse(JSON.stringify(obj))
JSON.parse(JSON.stringify(obj)实现数组的深拷贝 利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象
- 在ubuntu的bash中循环执行脚本,并在内存不足时重启
#!/bin/bash date ma=`grep MemAvailable /proc/meminfo | awk '{print $2}'` echo MemAvailable = $ma run ...