Vue组件简易模拟实现购物车


Posted in Vue.js onDecember 21, 2020

本文实例为大家分享了Vue组件模拟实现购物车的具体代码,供大家参考,具体内容如下

Vue组件简易模拟实现购物车

代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <script src="./lib/vue-2.4.0.js"></script>
 <style>
  #app{
   width:600px;
  }

  #myTable{
   width:500px;
   border-collapse:collapse;
  }

  td, th{
   text-align: center;
   font-size:20px;
   border:2px solid black;
  }

  td{
   height: 40px;
  }

  input{
   width: 30px;
   text-align: center   
  }

 </style>
</head>
<body>

 <div id="app">
  <my-cart></my-cart>
 </div>

 <script>
  var MyCommmodity = {
   props: ["list"],
   template:`
    <div>
     <button @click="baicai">白菜</button>
     <button @click="qingcai">青菜</button>
     <button @click="luobo">萝卜</button> 
    </div>
   `,
   methods: {
    baicai: function(){
     var cai = {};
     cai.id = 4;
     cai.name = "白菜"
     cai.price = 3;
     cai.num = 1;
     this.list.push(cai)
    },
    qingcai: function(){
     var cai = {};
     cai.id = 5;
     cai.name = "青菜"
     cai.price = 6;
     cai.num = 1;
     this.list.push(cai)
    },
    luobo: function(){
     var cai = {};
     cai.id = 6;
     cai.name = "萝卜"
     cai.price = 8;
     cai.num = 1;
     this.list.push(cai)
    }
   }
  }

  var MyTable = {
   props: ["list", "flag"],
   template:`
    <table id="myTable">
    <tr>
     <th>编号</th>
     <th>名称</th>
     <th>单价</th>
     <th>数量</th>
     <th>操作</th>
    </tr>
    <tr :key="item.id" v-for="item in list"> 
     <td>{{item.id}}</td>
     <td>{{item.name}}</td>
     <td>{{item.price}}</td>
     <td>
      <button :disabled="flag" @click="sub(item.id)">-</button>
      <input type="text" :value="item.num" @blur="changeNum(item.id,$event)">
      <button @click="add(item.id)">+</button>
     </td>
     <td>
      <button @click="del(item.id)">删除</button>
     </td>
    </tr>
   </table>
   `,
   methods: {
    changeNum: function(id, event){
     this.$emit("change-num",{
      id: id,
      type: "change",
      num: event.target.value
     });
    },
    sub: function(id){
     this.$emit("change-num",{
      id: id,
      type: "sub"
     })
    },
    add: function(id){
     this.$emit("change-num",{
      id: id,
      type: "add"
     })
    },    
    del: function(id){
     // alert(id);
     this.$emit("del-cart",id)
    }
   }
  }

  var MyPrice = {
   props: ["list"],
   template:`
    <div>
     <span>结算:</span>
     <span>{{total}}</span>     
    </div>
   `,
   computed: {
    total: function(){
     var t = 0;
     this.list.forEach(item => {
      t += item.price * item.num;
     });
     return t;
    }
   }
  }

  Vue.component('my-cart', {
   data () {
    return {
     flag:false,
     list:[{
      id: 1,
      name: "猪",
      price: "10",
      num:1,
     },
     {
      id: 2,
      name: "牛",
      price: "11",
      num:1,
     },
     {
      id: 3,
      name: "鸡",
      price: "13",
      num:1,
     }]
    }
   },
   template:`
    <div> 
     <my-commmodity :list="list"></my-commmodity> 
     <my-table :list="list" :flag="flag" @change-num="changeNum($event)" @del-cart="delCart($event)"></my-table>
     <my-price :list="list"></my-price>
        
    </div>
   `,
   components:{ 
    'my-table':MyTable,
    'my-price':MyPrice,
    'my-commmodity':MyCommmodity,
   },
   methods:{
    changeNum: function(val){
     if(val.type ==="change"){
      this.list.some(item=>{
       if(item.id == val.id){
        item.num = val.num;
        return true;
       }
      });      
     }else if(val.type ==="sub"){
      this.list.some(item=>{
       if(item.id == val.id && item.num >0){
        item.num -= 1;
        return true;
       }
      }); 
     }else if(val.type ==="add"){
      this.list.some(item=>{
       if(item.id == val.id){
        item.num += 1;
        return true;
       }
      }); 
     }

    },
    delCart: function(id){
     var index = this.list.findIndex(item=>{
      return item.id == id;
     })
     this.list.splice(index,1)
    }
   }
  })


 var vm = new Vue({
  el: '#app',
  data:{
  }
 })
 </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
Vue3.0 手写放大镜效果
Jul 25 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 Vue.js
Vue Element plus使用方法梳理
Dec 24 Vue.js
vue实现购物车的小练习
Dec 21 #Vue.js
Vue实现小购物车功能
Dec 21 #Vue.js
vue监听滚动事件的方法
Dec 21 #Vue.js
vue el-upload上传文件的示例代码
Dec 21 #Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 #Vue.js
vue中如何添加百度统计代码
Dec 19 #Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 #Vue.js
You might like
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php静态文件生成类实例分析
2015/01/03 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
解析js如何获取css样式
2016/12/11 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
django中的图片验证码功能
2019/09/18 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
应届毕业生求职信
2013/11/30 职场文书
个人简历自我评价
2014/01/06 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
如何理解及使用Python闭包
2021/06/01 Python
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技