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 相关文章推荐
JavaScript 无符号右移赋值操作
Apr 17 Javascript
javascrip关于继承的小例子
May 10 Javascript
购物车选中得到价格实现示例
Jan 26 Javascript
Node.js抓取中文网页乱码问题和解决方法
Feb 10 Javascript
jQuery实现强制cookie过期方法汇总
May 22 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
JQuery元素快速查找与操作
Apr 22 jQuery
Vue Element 分组+多选+可搜索Select选择器实现示例
Jul 23 Javascript
菊花转动的jquery加载动画效果
Aug 19 jQuery
vue中使用v-model完成组件间的通信
Aug 22 Javascript
JavaScript数组去重实现方法小结
Jan 17 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
php链式操作的实现方式分析
2019/08/12 PHP
js数组操作学习总结
2013/11/04 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
express.js中间件说明详解
2019/03/19 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
华为C++笔试题
2014/08/05 面试题
应用艺术毕业生的自我评价
2013/12/04 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
数学教学随笔感言
2014/02/17 职场文书
进口业务员岗位职责
2014/04/06 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
劳模事迹材料范文
2014/12/24 职场文书
辩护意见书
2015/06/04 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
element多个表单校验的实现
2021/05/27 Javascript
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫