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 相关文章推荐
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
Apr 02 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
BootStrap文件上传样式超好看【持续更新】
May 10 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
Vue实现点击时间获取时间段查询功能
Aug 21 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
Aug 20 Javascript
layui前端时间戳转化实例
Nov 15 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
Jan 21 Javascript
如何检测JavaScript中的死循环示例详解
Aug 30 Javascript
vue3.0 上手体验
Sep 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代码优化及php相关问题总结
2006/10/09 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
烹饪自我鉴定
2014/03/01 职场文书
农村婚礼主持词
2014/03/13 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
《海底世界》教学反思
2014/04/16 职场文书
四年级学生评语大全
2014/04/21 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python