完善慕课网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 本 ...
随机推荐
- EasyUI取消树节点选中
$('#organTree').find('.tree-node-selected').removeClass('tree-node-selected'); 取消树的节点选中
- 为什么90%的IT人员都不适合做老大?
什么是格局? 格局就是能够很好的平衡短期利益和长期利益. 过分注重短期利益的人必然会失去长期利益,到头来一定会很普通. 例如:跳槽不断,可能短期薪资会增长,但长期来看后劲可能会不足,未来发展空间会变窄 ...
- Git笔记(流水账)
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况: 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修 ...
- HDU 6092 01背包变形
Rikka with Subset Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- SQLite学习和使用
创建数据库并创建表格 1.创建MyDatabaseHelper继承于SQLiteOpenHelper(抽象类,必须实现onCreate()和onUpgrade()方法)2.把数据库建表指令弄成一个字符 ...
- Go语言之反射(三)
结构体转JSON JSON格式是一种用途广泛的对象文本格式.在Go语言中,结构体可以通过系统提供的json.Marshal()函数进行序列化.为了演示怎么样通过反射获取结构体成员以及各种值的过程,下面 ...
- 【Python】函数参数类型及用法
一.函数的参数类型 def hs(a1,a2,a3,...): ****statements 其中a1,a2,a3是函数的参数,函数的参数类型可分为:必须参数.默认参数.可变参数(不定长参数).关键 ...
- mysql练习题练习
1.数据库是按照原文制作的,表格结构一样具体存储的数据有些差异 原文地址:MySQL练习题 原答案地址:MySQL练习题参考答案 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: selec ...
- React基础(Diff算法,属性和状态)
1.React的背景原理 (1)React Diff算法流程 (2)React虚拟DOM机制 React引入了虚拟DOM(Virtual DOM)的机制:在浏览器端用Javascript实现了一套DO ...
- 纯js国际化(i18n)
i18n,是internationalization单词的简写,中间18个字符略去,简称i18n,意图就是实现国际化,方便产品在不同的场景下使用 目标:可以点击切换语言或者ChangeLanguage ...