Vue.js实现的购物车功能详解


Posted in Javascript onJanuary 27, 2019

本文实例讲述了Vue.js实现的购物车功能。分享给大家供大家参考,具体如下:

使用计算属性,内置指令,方法等基础知识开发购物车。

需求分析:展示一个已经加入购物车的商品列表,包含商品名称、商品单价、购买数量和操作,以及最后确定是否选中商品的功能,总价格为选中商品的价格,够买数量可以增加减少,商品可以从购物车中移除。效果如图所示:

Vue.js实现的购物车功能详解

——实例来自《Vue.js实战》第五章

逻辑整理:vue实例定义一个数组list存放商品信息,定义方法与减少按钮,增加按钮等联系,动态改变商品数量,通过handleRemove()移除list中的值;利用each()遍历所有type='checkbox'input,修改它们的状态,最后用totalPrices()计算商品总价格。

index.html

<div id="app">
    <template v-if="list.length">
      <table>
        <thead>
          <tr>
            <th></th>
            <th>商品名称</th>
            <th>商品单价</th>
            <th>购买数量</th>
            <th>操作</th>
            <th><input type="checkbox" name="list" @click="checkBox()" id="checkBox"></th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="(item, index) in list">
            <td>{{ index + 1 }}</td>
            <td>{{ item.name }}</td>
            <td>{{ item.price }}</td>
            <td>
                <button
                  @click="handleReduce(index)"
                  :disabled="item.count === 1" class="btn"> - </button>
                {{ item.count }}
                <button @click="handleAdd(index)" class="btn"> + </button>
            </td>
            <td>
                <button @click="handleRemove(index)" class="btns">移除</button>
            </td>
            <td style="text-align: center;">
                <input type="checkbox" name="list" @click="totalPrices()">
            </td>
          </tr>
        </tbody>
      </table>
      <div id="price">总价:¥{{totalPrice}}</div>
    </template>
    <div v-else>购物车为空</div>
</div>

style.css

*{
  margin: 0px;
  padding: 0px;
}
[v-cloak] {
  display: none;
}
#app{
  width: 200px;
  height: 200px;
  margin: 10px auto;
  text-align: center;
}
#price{
  width: 457px;
  height: 40px;
  border: 1px solid #e9e9e9;
  border-top: 0;
  line-height: 40px;
}
table{
  border: 1px solid #e9e9e9;
  border-collapse: collapse;
  border-spacing: 0;
  empty-cells: show;
}
th,td{
  padding: 8px 16px;
  border:1px solid #e9e9e9e9;
  text-align: left;
}
th{
  background: #f7f7f7;
  color: #5c6c77;
  font-weight: 600;
  white-space: nowrap;
}
.btn{
  width: 20px;
  height: 20px;
  border-radius: 50%;
  border:1px solid #cccccc;
  background: #ffffff;
  color: #778899;
}
.btns{
  width: 40px;
  height: 20px;
  border-radius: 5px;
  border:1px solid #cccccc;
  background: #ffffff;
  color: #778899;
  line-height: 20px;
}

app.js

var app=new Vue({
      el:'#app',
      data:{
        list: [
          {
            id:1,
            name:'iPhone 7',
            price:6188,
            count:1
          },
          {
            id:2,
            name:'iPad Pro',
            price:5888,
            count:1
          },
          {
            id:3,
            name:'MaxBook Pro',
            price:21488,
            count:1
          }
        ],
        totalPrice: 0
      },
      methods:{
        handleReduce: function (index) {//减少按钮
          if(this.list[index].count === 1){
            return;
          }
          this.list[index].count--;
          this.$options.methods.totalPrices();
        },
        handleAdd: function (index) {//增加按钮
          this.list[index].count++;
          this.$options.methods.totalPrices();
        },
        handleRemove: function (index) {//移除按钮
          this.list.splice(index, 1);
          $("tr").eq(index+1).remove("input[type='checkbox']");
          this.$options.methods.totalPrices();
        },
        checkBox: function (){//选中状态
          if($("#checkBox").is(':checked')==true){
            $("input[type='checkbox']").each(function(){
              $("input[type='checkbox']").attr("checked",true);
            });
          }else{
            $("input[type='checkbox']").each(function(){
              $("input[type='checkbox']").attr("checked",false);
            });
          }
          this.$options.methods.totalPrices();
        },
        totalPrices: function (){//计算总价格
          var total = 0;
          for(var i = 0;i < app.list.length;i++){
            var item = app.list[i];
            if($("input[type='checkbox']").eq(i+1).is(':checked')){
              total += item.price * item.count;
            }
          }
          app.totalPrice = total.toString().replace(/\B(?=(\d{3})+$)/g,',');
        }
      }
});

GitHub地址:https://github.com/GitHubVikas/Yao/tree/master/DemoOne

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
表单的一些基本用法与技巧
Jul 15 Javascript
Dom 学习总结以及实例的使用介绍
Apr 24 Javascript
javascript移动设备Web开发中对touch事件的封装实例
Jun 05 Javascript
JS来动态的修改url实现对url的增删查改
Sep 05 Javascript
JavaScript实现的一个日期格式化函数分享
Dec 06 Javascript
比较常见的javascript中定义函数的区别
Nov 09 Javascript
深入理解JavaScript中为什么string可以拥有方法
May 24 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 Javascript
解决vue里碰到 $refs 的问题的方法
Jul 13 Javascript
基于ES6 Array.of的用法(实例讲解)
Sep 05 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
浅谈React Native 传参的几种方式(小结)
May 21 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 #Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
Jan 25 #Javascript
命令行批量截图Node脚本示例代码
Jan 25 #Javascript
Node.js 进程平滑离场剖析小结
Jan 24 #Javascript
Vue.js样式动态绑定实现小结
Jan 24 #Javascript
实例讲解JavaScript预编译流程
Jan 24 #Javascript
实例讲解vue源码架构
Jan 24 #Javascript
You might like
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
2014/08/11 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
js 操作select相关方法函数
2009/12/06 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
很酷的星级评分系统原生JS实现
2016/08/25 Javascript
input框中的name和id的区别
2016/11/16 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
Python实现从百度API获取天气的方法
2015/03/11 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
2019/07/11 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
python实现在线翻译
2020/06/18 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
中专毕业生自我鉴定
2014/02/02 职场文书
校园公益广告语
2014/03/13 职场文书
体育教师个人工作总结
2015/02/09 职场文书
初中政教处工作总结
2015/08/12 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技