vue.js实现购物车功能
购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种:
1. 用户更新购物车里的商品后,页面自动刷新。
2. 使用局部刷新功能,服务器端返回整个购物车的页面html
3. 服务器端返回JSON格式,使用模板引擎+dom操作更新页面
最近新学习了vue.js,一个轻量级的mvvm(Model-View-ViewModel),vue.js是数据驱动无须操作dom,它提供特殊的html语言,把dom和数据绑定在一起,一旦修改了数据,dom将会自动更新更新。
关于vue.js的学习,请参考《Vue.js——60分钟快速入门》这篇文章或者去官网 https://cn.vuejs.org/ 学习。
下面就是用vue.js实现购物车。
第一步 定义view:
<div class="con">
<h1>购物车程序</h1>
<table class="table">
<tr>
<th>序号</th>
<th>商品</th>
<th>单价</th>
<th>数量</th>
<th>小计</th>
<th>操作</th>
</tr>
<tr v-for="x in goods_list">
<td>{{x.id}}</td>
<td>{{x.name}}</td>
<td class="price">¥{{x.price}}</td>
<td>
<input type="button" value="-" class="add" v-on:click="jian(x)">
<input type="text" :value="x.num" class="num num2" data-max="5" v-on:input="changeNumber($event,x)">
<input type="button" value="+" class="sub" v-on:click="jia(x)">
</td>
<td class="tprice price1">¥{{ x.price * x.num}}</td>
<td><input type="button" value="移除购物车" class="del" v-on:click="remove(x)"></td>
</tr>
</table>
<table>
<tr>
<th>购买商品总数量</th>
<th>总价</th>
</tr>
<tr>
<td class="tnum">{{count}}</td>
<td class="sumprice">¥{{total}}元</td>
</tr>
</table>
</div>
商品的总价栏位 使用自动计算,{{ goods.price * goods.num}}
view里使用了template语法,如果购物车里有商品则显示商品信息,否则就显示“购物车为空”,语法比较简单,大家看一下就明白了。
第二步 定义model:
var model = {
goods_list: [{name : "测试商品1",num : 1, price : 10.0},
{name : "测试商品2",num : 2, price : 20.0},
{name : "测试商品3",num : 3, price : 30.0},
{name: "测试商品4", num: 4, price: 40.0 }
]
};
第三步 将view和model绑定一起,初始化Vue对象
new Vue({
el: ".con",
data : model
});
效果见下图:

计算属性:
有同学该提出疑问了,view我们用了count和total这2个变量,可model里没有这2个变量啊,效果也是空的啊,别急别急,这2个值咱要用vue自动计算功能。
修改下初始化Vue代码部分
var table=new Vue({
el:".con",
data:{goods_list},
methods:{
//改变input的值的时候触发
changeNumber: function(event,x){
var obj=$(event.target);
x.num = parseInt(obj.val());
},
//删除
remove: function (x) {
if(confirm("您确定要删除吗?")){
goods_list.splice(x, 1);
}else{
return false;
}
},
//加
jia:function(x){
if(x.num>=x.max){
x.num=x.max
}else{
x.num+=1;
}
},
//减
jian:function(x){
if(x.num==1){
x.num==1
}else{
x.num-=1;
}
}
},
computed:{
count : function(){
var num = 0;
for(var i in this.goods_list){
num += parseInt(this.goods_list[i].num);
}
return num;
},
total : function(){
var total = 0;
for(var i in this.goods_list){
total += this.goods_list[i].price * this.goods_list[i].num;
}
return total;
}
},
})
绑定事件
购物车里用户会修改商品数量、移除商品等操作,这里我们就增加修改数量和删除事件。
第一步 修改view,增加事件绑定:
<tr v-for="x in goods_list">
<td>{{x.id}}</td>
<td>{{x.name}}</td>
<td class="price">¥{{x.price}}</td>
<td>
<input type="button" value="-" class="add" v-on:click="jian(x)">
<input type="text" :value="x.num" class="num num2" data-max="5" v-on:input="changeNumber($event,x)">
<input type="button" value="+" class="sub" v-on:click="jia(x)">
</td>
<td class="tprice price1">¥{{ x.price * x.num}}</td>
<td><input type="button" value="移除购物车" class="del" v-on:click="remove(x)"></td>
</tr>
这里绑定事件用了v-on:事件名的方式,当然也可以用简写即“@事件名”,比如@click、@blur等等,不过Razor模版会把@事件识别为变量,所以这里还是用全名。
“changeNumber(goods,$event)”,我们要获取input的值也就是原生dom对象,所以需要传递event,不过要用特殊变量$event。
第二步 Vue初始化增加methods属性:
methods:{
//改变input的值的时候触发
changeNumber: function(event,x){
var obj=$(event.target);
x.num = parseInt(obj.val());
},
//删除
remove: function (x) {
if(confirm("您确定要删除吗?")){
goods_list.splice(x, 1);
}else{
return false;
}
},
至此我们的购物车基本功能就完成了,如果在购物车页面添加商品到购物车里只需要往model.goods_list里增加对象即可。
再配合Ajax调用后台程序持久化购物车里的商品信息就OK了,这部分代码就不贴上来了,大家可以自行实现。
vue.js实现购物车功能的更多相关文章
- 用vue.js实现购物车功能
购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...
- 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...
- CI 结合 vue.js 的搜索功能模块
CI 结合 vue.js 的搜索功能模块 最近在有优化公司后台的某个模块的搜索功能优化 原先的是这个样子的,很是单调: 老大给我找个图希望我能弄成这样子: 经过不断修改,最后成了这样子 是不是比以前好 ...
- vue.js实战——购物车练习(包含全选功能)
vue.js实战第5章 54页的练习1 直接放代码好了,全选的部分搞了好久,代码好像有点啰嗦,好在实现功能了(*^▽^*) HTML: <!DOCTYPE html> <html l ...
- vue 入门 ------简单购物车功能实现(全选,数量加减,价格加减)
简易购物车功能(无任何布局 主要是功能) 数量的加减 商品的总价钱 全选与全不选 删除(全选.价格 受影响) <script src="https://cdn.jsdelivr.net ...
- 一周一个小demo — vue.js实现备忘录功能
这个vue实现备忘录的功能demo是K在github上找到的,K觉得这是一个用来对vue.js入门的一个非常简单的demo,所以拿在这里共享一下. (尊重他人劳动成果,从小事做起~ demo原git ...
- Vue.js实现登录功能
编写html,通过vue-resource.js库向后台提交数据 <!DOCTYPE html> <html lang="en"> <head> ...
- Vue.js实现注册功能
编写html,通过vue-resource.js库向后台提交数据 <!DOCTYPE html> <html lang="en"> <head> ...
- 用Vue来实现购物车功能(二)
这个小demo具有添加商品进购物车 .增加购物车内商品的数量.减少购物车内商品的数量.计算一类商品的总价.以及计算所有商品的总价 首先看目录结构 因为我们的Tab.vue Car.vue 以及Car ...
随机推荐
- js中获取一个对象里面的方法和属性的javascript
<script type="text/javascript"> var obj = { attribute:1, method:function() { alert(& ...
- ext.js的目录结构的简单解释
adapter:负责将里面提供第三方底层库(包括Ext自带的底层库)映射为Ext所支持的底层库. build: 压缩后的ext全部源码(里面分类存放). docs: API帮助文档. ...
- 关于C/s结构 本地目录的思考
对于一般客户而言,程序使用时,查看本地目录下的对应内容. 如果有则正常使用.实际上相当于缓存,加快程序执行速度. 如果缓存里没有东西,比如被删除了,那么就在数据库中查找.然后生成缓存. 这样的好处,是 ...
- springboot找不到主类
在学习springboot的时候,前几天写了一个demo,正常运行,一点问题也没有.今天运行不起来了. 报错:找不到主类 解决方案: Project->Clean->选中项目,点击Clea ...
- oracle 中decode函数用法
学习记录: 含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 ...
- python3与python2的区别(目前遇到的)
1.进击的print,变成一个函数,print() 2.urllib大一统,呵呵 3.python3默认绝对路径导入
- 了解Queue
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue, 可以对应着 ...
- 如何成功再次安装MYSQL
以前安过,后来再安装就是停在启动项就是过不去,无响应 弄了两天,期待奇迹,网上各种教程试了个遍就是不行,大体就是删除INI,清理注册表,以下是新的发现:(转载) 如果你的电脑里装过MySQL,想再重新 ...
- Struts2把数据封装到集合中之封装到map中
struts框架封装数据可以封装到集合中也可以封装到map中,该篇博客主要讲解将数据封装到map中. 1. 封装复杂类型的参数(集合类型 Collection .Map接口等) 2. 需求:页面中有可 ...
- Task.WaitAll代替WaitHandle.WaitAll
Task.Waitall阻塞了当前线程直到全完.whenall开启个新监控线程去判读括号里的所有线程执行情况并立即返回,等都完成了就退出监控线程并返回监控数据. task.Result会等待异步方法返 ...