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 相关文章推荐
前端开发必须知道的JS之原型和继承
Jul 06 Javascript
关于JS控制代码暂停的实现方法分享
Oct 11 Javascript
js 获取和设置css3 属性值的实现方法
May 06 Javascript
jquery 列表双向选择器之改进版
Aug 09 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
Apr 06 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
HTML Table 空白单元格补全的简单实现
Oct 13 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
three.js加载obj模型的实例代码
Nov 10 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
Sep 24 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 VS ASP
2006/10/09 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
JQuery小知识
2010/10/15 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
js文字横向滚动特效
2015/11/11 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
浅析Python3爬虫登录模拟
2018/02/07 Python
详解python中@的用法
2019/03/27 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
大学生收银员求职信分享
2014/01/02 职场文书
二手房买卖协议书
2014/04/10 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
SQL基础的查询语句
2021/11/11 MySQL
索尼ICF-36收音机评测
2022/04/30 无线电