vue购物车的实现
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>后盾人-购物车</title>
    <script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.js"></script>
    <link href="https://cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container" id="app">
    <div class="row" >
        <template v-if="goods.length==0">
            <div class="panel panel-default">
                <div class="panel-body">
                    <p>购物车空空如也~~</p>
                </div>
            </div>
        </template>
        <template v-else>
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">购物车</h3>
                </div>
                <div class="panel-body">
                    <table class="table table-hover">
                        <thead>
                        <tr>
                            <th>
                                <input type="checkbox" @click="selecAll" v-model="allChecked">
                            </th>
                            <th>商品名称</th>
                            <th>商品单价</th>
                            <th>购买数量</th>
                            <th>小计</th>
                            <th>操作</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr v-for="(v,k) in goods">
                            <td>
                                <input type="checkbox" @click="select(v.id)" :checked="allSelectData.indexOf(v.id)!=-1">
                                <!--<input type="checkbox"  @click="select(v.id)" :checked="allSelectData.indexOf(v.id)!=-1">-->
                            </td>
                            <td>{{v.name}}</td>
                            <!--<td>{{v.price}}</td>-->
                            <td><input type="text" v-model="v.price"></td>
                            <td>
                                <button @click="reduce(v,k)">-</button>
                                <input type="text" v-model="v.num" style="width: 30px;text-align: center">
                                <button @click="plus(k)">+</button>
                            </td>
                            <td>{{v.price*v.num}}</td>
                            <td>
                                <div class="btn-group btn-group-xs">
                                    <!--删除方法一-->
                                    <!--<button @click="del(k)" type="button" class="btn btn-danger">删除</button>-->
                                    <!--删除方法二-->
                                    <button @click="goods.splice(k,1)" type="button" class="btn btn-danger">删除</button>
                                </div>
                            </td>
                        </tr>
                        </tbody>
                    </table>
                </div>
                <div class="panel-footer" style="text-align: right">
                    共计 <span>{{totalPrice}}</span> 元
                </div>
            </div>
        </template>
    </div>
</div>
<script>
    var data = [1,2,6,7,8,9];
    //检测元素是否在数组中
    // console.log(data.indexOf(1));
    new Vue({
        el:'#app',
        data:{
            //购物车数据
            goods:[
                {id:1,name:'联想 K5 Note 4GB+64GB 6英寸全面屏双摄手机 全网通 移动4G+ 双卡双待 极地黑',price:999,num:1},
                {id:2,name:'一加手机6 8GB+128GB 亮瓷黑 全面屏双摄游戏手机 全网通4G 双卡双待 骁龙845',price:3599,num:1},
                {id:3,name:'小米MIX2 全面屏游戏手机 6GB+64GB 黑色 全网通4G手机 双卡双待 5.99"大屏,',price:2599,num:1},
                {id:4,name:'OPPO R15 全面屏双摄拍照手机 4G+128G 幻色粉 全网通 移动联通电信',price:2699,num:1},
                {id:5,name:'Apple MacBook Air 13.3英寸笔记本电脑 银色(2017款Core i5 处理器/8GB内',price:6588,num:1},
                {id:6,name:'Apple MacBook Pro 15.4英寸笔记本电脑 银色(Core i7 处理器/16GB内存/256GB ',price:12277,num:1},
                {id:7,name:'Apple MacBook Pro 15.4英寸笔记本电脑 银色(2017款Multi-Touch Bar/Core ',price:17588,num:3},
                {id:8,name:'Apple iPhone X (A1903) 64GB 深空灰色 移动联通4G手机 【支持移动联通4G】',price:6999,num:1},
                {id:9,name:'Apple 苹果 iPhone X手机 银色 全网通64G 【6.5白条全场三期免息】下单送透明壳',price:7498,num:1},
                {id:10,name:'Apple 苹果X iPhoneX 全面屏手机 银色 全网通 256G 【京仓配送 时效快捷 】入仓',price:8738,num:1},
            ],
            //控制全选
            allChecked:false,
            //商品数据选中
            allSelectData : [],
//                allSelectData2 : [],
        },
        mounted(){
            //控制加载完页面全部选中
            this.goods.forEach((v,k)=>{
                this.allSelectData.push(v.id);
            })
            this.allChecked=true;
        },
        methods:{
            //购物车数量增加
            plus(k){
                this.goods[k].num++;
            },
            //购物车数量减少
            reduce(v,k){
                //方法一
//                this.goods[k].num--;
//                if(this.goods[k].num==0){
//                    this.goods.splice(k,1);
//                }
               //方法二:
                v.num--;
                if(v.num==0){
                   this.goods.splice(k,1);
                }
            },
            //购物车删除
            del(k){
                this.goods.splice(k,1);
            },
            //单击全选按钮
            selecAll(){
//                    console.log(event.currentTarget.checked);
                console.log(!this.allChecked);
//                    if(!event.currentTarget.checked){
                if(this.allChecked){
                    //取消全选
                    this.allSelectData = [];
                }else{
                    //全选
                    this.goods.forEach((v,k)=>{
                        this.allSelectData.push(v.id);
                    })
                }
            },
            select(id){
                //知道当前点击商品对应的商品编号是否在allSelectData数组中
                var res = this.allSelectData.indexOf(id);
                res == -1 ? this.allSelectData.push(id) : this.allSelectData.splice(res,1);
                this.allChecked = this.goods.length == this.allSelectData.length;
            }
        },
        computed:{
            totalPrice(){
                var total=0;
                this.goods.forEach((v,k)=>{
                    var res = this.allSelectData.indexOf(v.id);
                    //计算总价只计算在allSelectData商品
                    if(res != -1){
                        total += v.num * v.price;
                    }
                })
                return total;
            }
        }
    })
</script>
</body>
</html>
效果:

vue购物车的实现的更多相关文章
- Vue购物车实例
		
<div class="buyCarBox" id="buyCarBox" v-cloak> <div class="haveClo ...
 - vue 购物车练习
		
本人看了vue官网上的教程后,感觉对vue的依稀有点了解,决定动手练习个小功能项目,就找了购物车本项目.原文链接:http://blog.csdn.net/take_dream_as_horse/ar ...
 - vue购物车和地址选配(三)
		
参考资料:vue.js官网 项目演示: 项目源代码: 核心代码及踩坑 删除: new Vue({ el:'#app', data:{ productlist:[], totalMoney:0, che ...
 - vue购物车功能源码
		
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
 - Vue购物车
		
index.html <!DOCTYPE html><html> <head> <meta charset="utf-8&quo ...
 - VUE购物车示例
		
代码下载地址:https://github.com/MengFangui/VueShoppingCart 1.index.html <!DOCTYPE html> <html lan ...
 - vue购物车动画效果
		
使用动画的三个函数 v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter=&q ...
 - 第八十三篇:Vue购物车(四) 总价计算
		
好家伙, 1.总价计算 来了,又先是一波分析: 我们用一个计算属性amt 我们把item中被勾选的项用一个过滤器过滤器来 然后用一个循环相加,把商品的价格乘以商品的数量, 把这个总值返回出去, 然后组 ...
 - 第八十二篇:Vue购物车(三) 实现全选功能
		
好家伙, 继续完善购物车相应功能 1.如何实现全选和反全选 1.1.全选框的状态显示(父传子) 来一波合理分析: 在页面中,有三个商品中 三个商品中的第二个未选择, 我么使用一个计算属性(fullSt ...
 
随机推荐
- Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API
			
用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...
 - Mercurial(HG) Windows+Eclipse安装、配置、使用
			
Mercurial(HG) Windows客户端安装 Mercurial(HG): http://mercurial.selenic.com/ Windows客户端下载:http://mercuria ...
 - easyui框架中关于dialog自带关闭事件的使用
			
easyui是一个开源的第三方控件库,虽然使用比较方便,但其中有些事件和样式会与其他的控件或者框架形成冲突. 今天谈一下easyui 中dialog这个控件(对话框) easyui dialog一般在 ...
 - 【心得】asp.net  异常:正在中止线程   引发的问题
			
asp.net做的一个同步程序,同步的方法是通过JQuery的Ajax调用,同步过程所需要的时间大概有几个小时吧. 当在本机运行的时候,无论是debug模式还是release模式,都能正常运行. 发布 ...
 - yum 和 rpm安装mysql彻底删除
			
1.yum方式安装的MySQL $ yum remove mysql mysql-server mysql-libs compat-mysql51 $ rm -rf /var/lib/mysq $ r ...
 - This is your path and you will pursue it with excellence.
			
This is your path and you will pursue it with excellence.自己选的路就要走出精彩.
 - Vue通过状态为页面切换添加loading、为ajax加载添加loading
			
以下方法需要引入vuex,另使用了vux的UI框架,ajax添加loading还引入了axios. 一.为页面切换添加loading. loading.js: import Vue from 'vue ...
 - React 官网列子学习
			
一个有状态的组件 除了接受输入数据(通过 this.props ),组件还可以保持内部状态数据(通过this.state ).当一个组件的状态数据的变化,展现的标记将被重新调用render() 更新. ...
 - 网页游戏中PK系统的实现
			
在游戏开发过程中,写过一个简单的PK系统面板,涉及到前端和后端的交互,我将自己制作的流程分享给大家,大概流程是这样:前端发送PK邀请给后端,后端受到请求后将信息返回给前端处理,先来看下整个流程图及思路 ...
 - php编译安装过程中遇到问题
			
编译安装PHP时遇到的问题 问题1: configure: error: xml2-config not found. Please check your libxml2 installation. ...