完善慕课网Vue2.0购物车功能
vue一个Made in China创造出来的框架真的很66666~
如果你是刚入门还不太懂也没有看慕课网上这门视频的,请先看一遍或许你会收获满满~
使用vue2.0实现购物车和地址选配功能这门课程,早之前就在慕课网上看了,个人感觉很不错很适合刚入门vue的新手,最近做的项目都没用vue怕自己生疏了所以就再做一下练练手顺便完善一下老师没有做的小功能。
课程中实现的功能:商品列表的渲染、使用过滤器格式化商品金额、实现单件商品的计算单选全选、实现商品总金额计算和删除商品
完善的功能:
单选按钮如果全部选中则全选按钮为选中状态,如果没有全部选中则为默认状态
使用计算属性来改写计算总金额;》
先看一下完善后的效果图:

先创建一个vue的实例,以下列出的是本项目使用的选项参数
new Vue({
el: '', //挂载的元素
data: {}, //数据
mounted(){}, //生命周期钩子
computed: {}, //计算属性
methods: {}, //方法
filters:{} //过滤器
})
vue中常用的指令,本项目用到的是 v-for、v-bind、v-on、v-model、v-show
v-bind 动态的绑定数据。简写为 :
v-on 绑定事件监听器。简写为 @
v-for 循环数据
v-model 在表单控件元素上创建双向数据绑定
v-if v-else-if v-else 条件判断指令
vue中的生命周期钩子函数,本项目用到的是 mounted 钩子函数
beforeCreate 数据绑定前
created 数据绑定后
beforeMount 挂载之前
mounted 挂载之后
beforeUpdate 更新之前
updated 更新之后
beforeDestroy 销毁之前
destroyed 销毁之后
这里简但说一下思路,没看过视频想深入学习的请前往慕课网。
1、在data里声明一个lists数组,用vue-resource获取数据,把它写成一个fetchData方法放在methods里,在mounted后调用这个方法把返回结果赋给lists
vue-resource和ajax一样都是用来获取数据的,但vue-resource返回的res是经过封装的,我们需要的数据在body那个属性里也可以使用data都可以

fetchData(){
var _self = this;
this.$http.get("../data/cart.json").then(function(res){
_self.lists = res.data.result.productList
},function(){
})
}
2、使用v-for渲染商品列表, v-for写法 v-for="item in items"
3、使用filter过滤器将页面所有的金额格式化统一保留两位小数并添加“¥”符号:
全局过滤器方法:把 filter 挂到 Vue 上,Vue.filter(name,func); 第一个参数就是过滤器的名字,第二个参数就是一个回调函数 ,这里要注意一点如果你按照课上所写的讲全局过滤器写在了底部,当你结合计算属性computed使用的时候会报错,所以将声明的全局使用的都放在最顶端,让它先加载
Vue.filter('money',function(val,type) {
return "¥" + val.toFixed(2) + type;
});
局部过滤器方法:就是在之前实例里的 filters 选项参数里声明
filters:{
formatMoney: function(val){
return "¥" + val.toFixed(2);
}
}
4、给 “+” 和 “-” 添加点击事件,点击事件用 v-on:click 可以缩写为 @click ,方法都写在methods里,利用vue的数据双向绑定 v-model指令来绑定 input里的值,至于这里传的 item 和 -1这些参数,老师都讲过了,不明白的去看视频
<a href="javascript:;" @click="change(item,-1)">-</a>
<input type="text" disabled v-model="item.productQuentity">
<a href="javascript:;" @click="change(item,1)">+</a>
定义一个change方法
change(item,type){
if(type>0){
item.productQuentity++
}else{
item.productQuentity--;
if(item.productQuentity<1){
item.productQuentity=1
}
}
}
5、给单选按钮添加事件,同时需要使用 v-bind:class 动态添加class来改变按钮选中和未选中样式,如果你想实现淘宝或京东那种效果就是当你把单选按钮都选中后底下的全选按钮就要变为了选中状态,这里你就需要在data里再声明一个属性 checkNum 用它来计算当前有几个是选中状态,所以在点击按钮的时候就要让 checkNum++, 最后判断 checkNum 是否等于按钮的长度,就是这么简单,就是这么自然~
<a href="javascipt:;" class="item-check-btn" :class="{'check':item.checked}" @click="chose(item)">
<svg class="icon icon-ok"><use xlink:href="#icon-ok"></use></svg>
</a>
chose(item){
if(typeof item.checked == "undefined"){
this.$set(item,'checked',true);
this.checkNum++
}else{
item.checked = !item.checked;
if(item.checked){
this.checkNum++
}else{
this.checkNum--
}
}
this.lists.forEach( (element, index) => {
if(element.checked && this.checkNum==this.lists.length){
this.flag=true
}else{
this.flag = false
}
})
if(this.flag){
this.checkFlag = true
}else{
this.checkFlag = false
}
}
6、给全选和取消全选按钮添加事件同时动态绑定class,这就很简单了直接循环遍历,把所有对象里checked属性设为 true,这里有一点需要注意的是当你全选或取消全选的时候一定要改变data里 checkNum 的值
selectAll(type){
this.checkFlag = type;
this.lists.forEach( (element, index) => {
if(typeof element.checked == "undefined"){
this.$set(element,'checked',type)
}else{
element.checked = type
}
});
if(type){
this.checkNum = this.lists.length
}else{
this.checkNum = 0;
}
}
7、接下来就是计算总金额了,课上老师讲的是在methods里写了一个方法,在点击增加和减少按钮的时候去调用,我这里是用计算属性computed来实现的,计算属性的好处就是如果有改变了它会自动重新计算,不用再去点击按钮的时候调用,这里用到的 allMoney 需要在data里声明一下:
computed: {
totalMoney(){
this.allMoney = 0;
this.lists.forEach( (item, key) => {
if(typeof item.checked != "undefined" && item.checked==true){
this.allMoney += item.productQuentity*item.productPrice
}
});
return this.allMoney
}
}
8、删除功能,点击删除按钮弹出遮罩层和对话框,对于动态切换显隐我们可以动态添加class也可以使用 v-if / v-show, 先在data里声明一个 iShow 来控制显隐,对于弹框我们绑定class这样写v-bind:class="{'md-show':iShow}" ,对于遮罩层我们使用v-show这样写v-show="iShow",然后为删除按钮添加事件同时把删除的元素传递过去,在data里声明一个 deletId 用来记录删除的元素
<a href="javascript:;" class="item-edit-btn" @click="delet(item)">
<svg class="icon icon-del"><use xlink:href="#icon-del"></use></svg>
</a>
delet(item){
this.iShow=true;
this.deletId = this.lists.indexOf(item);
},
deletOk(){
this.lists.splice(this.deletId,1);
this.iShow=false;
}
ok ,整个思路就这样了,你也可以去看视频自己试着练一下
技术更新实在太快了,就在今天Vue2.3.0发布了同时还发布了Vue2.3.0服务端渲染,如果你想了解vue可以猛击下面的链接:
https://cn.vuejs.org/v2/guide/installation.html
Vue.js
Vuejs 2.0
完善慕课网Vue2.0购物车功能的更多相关文章
- vue2.0 代码功能片段
1.代码片段截取 checkAll: function(flag){ this.checkAllFlag = flag; this.productList.forEach(function(value ...
- 关于慕课网《使用vue2.0实现购物车和地址选配功能》的总结
视频学习网址:http://www.imooc.com/learn/796 源码打包:https://codeload.github.com/fachaoshao/Vue-ShoppingCart/z ...
- vue2.0实现购物车功能
购物车功能是一件比较繁琐的事情,逻辑功能太多,今天就用vue2.0实现一个简单的购物车功能,数据都本地自己写的假数据 功能列表: 1.全选和单选结算 2.减少和增加数量 3.商品的删除 界面搭建以及布 ...
- 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...
- vue2.0实践 —— Node + vue 实现移动官网
简介 使用 Node + vue 对公司的官网进行了一个简单的移动端的实现. 源码 https://github.com/wx1993/node-vue-fabaocn 效果 组件 轮播图(使用 vu ...
- Vue2.0实现1.0的搜索过滤器功能
Vue2.0删除了很多1.0的比较实用的过滤器,如filterBy,orderBy.官方文档给了通过计算属性实现1.0搜索过滤器功能,自己又加入了大小写通用检索功能,比较简单,学一下. <bod ...
- 饿了么基于Vue2.0的通用组件开发之路(分享会记录)
Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库.今天我们要分享的就是开发 Element 的一些心得. 官网 ...
- Vue2.0的通用组件
饿了么基于Vue2.0的通用组件开发之路(分享会记录) Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库. ...
- 前后端分离之vue2.0+webpack2 实战项目 -- webpack介绍
webpack的一点介绍 Webpack 把任何一个文件都看成一个模块,模块间可以互相依赖(require or import),webpack 的功能是把相互依赖的文件打包在一起.webpack 本 ...
随机推荐
- question 002: dev c++ 当中如何调整字体大小?How to get the first program with C++? c++属于什么软件?
方法:按住ctrl+鼠标滑轮滚动 c++属于系统软件还是应用软件? 说哪个都不对,编译之前属于应用软件,after compile ,it belongs to system software. #i ...
- Http请求 GET和POST,405错误
我就简单说吧,在用SringMVC时,我们通常会用到 @RequestMapping(value="/test",method=RequestMethod.GET) public ...
- C++ lambda 表达式 简介
自己根据对lambda表达式的理解,做了一套ppt简单介绍
- Linux入门-第八周
1.用shell脚本实现自动登录机器 #!/usr/bin/expectset ip 192.168.2.192set user rootset password rootspawn ssh $use ...
- 5.Cisco Packet Tracer里关于交换机或路由器配置文件和系统映像备份与恢复
我们会将交换机或路由器的配置文件和系统镜像直接备份到tftp服务器上,所以我们需要准备一台tftp的服务器 1我们需要给服务器配一个ip地址,给路由器的f0/1端口配置一个ip地址,路由器与服务器能相 ...
- nuxt.js express模板项目服务器部署
nuxt版本:0.10.6 技术栈:nuxt.js, express, pm2 部署环境:windows server 之前用nuxt.js 的express的模板项目在windows下用nginx进 ...
- callback回调函数【转】
请给作者点赞--> 原文链接 什么是回调函数? 我们绕点远路来回答这个问题. 编程分为两类:系统编程(system programming)和应用编程(application programmi ...
- Linux 用户行为日志记录
工作中我们常常遇到,有的员工不安于被分配的权限,老是想sudo echo "ziji" /usr/bin/visudo NOPASSWD:ALL来进行提权,造成误删了数据库某条重要 ...
- HDU 4825 Xor Sum (trie树处理异或)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- P3376 【模板】网络最大流dinic算法
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...