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 相关文章推荐
phpwind放自动注册方法
Dec 02 Javascript
js监听输入框值的即时变化onpropertychange、oninput
Jul 13 Javascript
jquery交替变换颜色的三种方法 实例代码
Nov 19 Javascript
JavaScript实现将文本框的值插入指定位置的方法
Aug 13 Javascript
javascript实现拖放效果
Dec 16 Javascript
javascript基本算法汇总
Mar 09 Javascript
详解React 16 中的异常处理
Jul 28 Javascript
详解angular2如何手动点击特定元素上的点击事件
Oct 16 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
Jun 13 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
Sep 11 Javascript
浅谈Vue SSR中的Bundle的具有使用
Nov 21 Javascript
JavaScript多种图形实现代码实例
Jun 28 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 magic quotes的详解
2013/06/17 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
基于nodejs的微信JS-SDK简单应用实现
2019/05/21 NodeJs
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
详解node.js 事件循环
2020/07/22 Javascript
django 自定义用户user模型的三种方法
2014/11/18 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
HTML5 Canvas概述
2009/08/26 HTML / CSS
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
幼儿园教师国培感言
2014/02/02 职场文书
机房搬迁方案
2014/05/01 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python