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 相关文章推荐
10款非常有用的 Ajax 插件分享
Mar 14 Javascript
js中的前绑定和后绑定详解
Aug 01 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
Apr 17 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
使用jquery获取url及url参数的简单实例
Jun 14 Javascript
Angularjs 创建可复用组件实例代码
Oct 09 Javascript
js实现的在线调色板功能完整实例
Dec 21 Javascript
jQuery实现选中行变色效果(实例讲解)
Jul 06 jQuery
判断jQuery是否加载完成,没完成继续判断的解决方法
Dec 06 jQuery
vue-router的hooks用法详解
Jun 08 Javascript
element 动态合并表格的步骤
Dec 31 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利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
javascript类继承机制的原理分析
2009/09/12 Javascript
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
管理科学大学生求职信
2013/11/13 职场文书
商场主管竞聘书
2014/03/31 职场文书
自我推荐信范文
2014/05/09 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
爱的教育读书笔记
2015/06/26 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
opencv 分类白天与夜景视频的方法
2021/06/05 Python
Python集合set()使用的方法详解
2022/03/18 Python
MySQL分区表管理命令汇总
2022/03/21 MySQL
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库