饿了吗开源组件库Element模拟购物车系统

传统的用html+jquery来实现购物车系统要非常的复杂,但是购物车系统完全是一个数据驱动的系统,因此采用诸如Vue.js、angular.js这些框架要简单的多。饿了吗开源的组件库Element是基于Vue.js 2.0实现的,该组件库封装了开发中需要的各种组件,并且提供了友好的API文档供开发者查看,下面就是我用Element实现的一个简单的购物车系统。(https://github.com/iwideal/MyGit/tree/master/HTML/shopping-cart
首先,我们用Vue.js推荐的命令行工具来搭建项目骨架。

# 创建一个基于 webpack 模板的新项目
$ vue init webpack shopping-cart
# 安装依赖,走你
$ cd shopping-cart
$ npm install
$ npm run dev

这时候,生成的项目骨架如图:



这时候,我们要像maven一样,给项目添加依赖,在package.json文件中添加Element依赖:

 "dependencies": { "element-ui": "^1.1.6", "vue": "^2.1.0" },

添加完依赖之后,这是我们可以在项目中使用依赖了,在main.js文件中,导入ElementUI:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
import App from './App.vue'
Vue.use(ElementUI)
/* eslint-disable no-new */
new Vue({ el: '#app', template: '<App/>', components: { App }})

重新安装依赖:

$ cd shopping-cart
$ npm install
$ npm run dev

这时,我们在App.vue中,写入我们的购物车代码。
预览一下,整体效果如下:


一、创建购物车骨架,即复杂型的表格。我们这时可以从Element的官网(http://element.eleme.io/#/zh-CN/component/table)copy过来模板,我们选择带有checkbox的表格:

<template>
<div> 
<el-table :data="tableData" border style="width: 100%" @selection-change="selected"> 
<el-table-column type="selection" width="50"> </el-table-column>
<el-table-column label="商品名称" width="680"> 
<template scope="scope"> 
<div style="margin-left: 50px">
![](scope.row.goods.img) 
<span style="font-size: 18px;padding-left: 200px;">{{scope.row.goods.descript}}</span> 
</div>
</template> 
</el-table-column>
<el-table-column label="单价" width="150" prop="price"> </el-table-column> 
<el-table-column label="数量" width="200">
<template scope="scope"> 
<div> 
<el-input v-model="scope.row.number" @change="handleInput(scope.row)"> 
<el-button slot="prepend" @click="del(scope.row)">
<i class="el-icon-minus"></i>
</el-button>
<el-button slot="append" @click="add(scope.row)">
<i class="el-icon-plus"></i>
</el-button>
</el-input>
</div> 
</template> 
</el-table-column> 
<el-table-column label="小计" width="150" prop="goodTotal"> </el-table-column> 
<el-table-column label="操作">
<template scope="scope"> 
<el-button type="danger" @click="handleDelete(scope.$index, scope.row)"> 删除
<i class="el-icon-delete2 el-icon--right"></i>
</el-button>
</template> 
</el-table-column>
</el-table> <br> 
<el-button type="info" style="float: right">{{"商品总额:" + moneyTotal}}</el-button>
</div>
</template>

购物车骨架搭建好之后,我们就可以向里面插入数据了:

data() {
 return {
 tableData: [
{
  goods:{ 
  img:'http://i1.mifile.cn/a1/pms_1474859997.10825620!80x80.jpg', 
  descript:'小米手环2',
 }, 
  price:149, 
  number:1,
 goodTotal:149,
 },
{ 
goods:{ 
img:'http://i1.mifile.cn/a1/pms_1482321199.12589253!80x80.jpg', 
descript:'小米活塞耳机 清新版 黑色', 
},
 price:29,
 number:1, 
goodTotal:29,
 },
{ 
goods:{ 
img:'http://i1.mifile.cn/a1/pms_1468288696.74437986!80x80.jpg', 
descript:'米家LED随身灯 增强版 蓝色', }, 
price:14.9, 
number:1, 
goodTotal:14.9, 
},
{ 
goods:{ 
img:'http://i1.mifile.cn/a1/pms_1476688193.46995320.jpg?width=140&height=140', 
descript:'10000mAh小米移动电源2 银色',
 }, 
price:79, 
number:1,
 goodTotal:79, 
}
],
 moneyTotal:0, 
multipleSelection:[],
 } 
}

这时候,我们需要对购物车中的各种事件做处理,包括删除商品、增加(减少)商品数量、选中商品等:

methods: { 
handleDelete(index, row) { 
this.$confirm('确定删除该商品?', '提示', { 
confirmButtonText: '确定', 
cancelButtonText: '取消', 
type: 'warning' 
}).then(() => { 
//删除数组中指定的元素 this.tableData.splice(index,1);
 this.$message({ type: 'success', message: '删除成功!' }); 
}).catch(() => { 
this.$message({ type: 'info', message: '已取消删除' });
 });
 }, 
handleInput:function(value){
 if(null==value.number || value.number==""){
 value.number=1;
 }
 value.goodTotal=(value.number*value.price).toFixed(2);
//保留两位小数 //增加商品数量也需要重新计算商品总价 
this.selected(this.multipleSelection); 
}, 
add:function(addGood){ 
//输入框输入值变化时会变为字符串格式返回到js
 //此处要用v-model,实现双向数据绑定 
if(typeof addGood.number=='string'){ 
addGood.number=parseInt(addGood.number);
 }; 
addGood.number+=1; 
}, 
del:function(delGood){ 
if(typeof delGood.number=='string'){ 
delGood.number=parseInt(delGood.number); 
};
 if(delGood.number>1){
 delGood.number-=1; 
} 
}, 
//返回的参数为选中行对应的对象 
selected:function(selection){ 
this.multipleSelection=selection;
 this.moneyTotal=0;
 //此处不支持forEach循环,只能用原始方法了
 for(var i=0;i<selection.length;i++){
 //判断返回的值是否是字符串
 if(typeof selection[i].goodTotal=='string'){
 selection[i].goodTotal=parseInt(selection[i].goodTotal); 
}; 
this.moneyTotal+=selection[i].goodTotal;
 }
 },
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容