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 相关文章推荐
在vue中通过render函数给子组件设置ref操作
Nov 17 Vue.js
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
Vue3 实现双盒子定位Overlay的示例
Dec 22 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
vue实现登录功能
Dec 31 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue里使用create, mounted调用方法
Apr 26 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
vue实现在data里引入相对路径
Jun 05 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 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
星际实力自我测试
2020/03/04 星际争霸
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
javascript高亮效果的二种实现方法
2008/09/14 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
JS中sort函数排序用法实例分析
2016/06/16 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
机械专业应届生求职信
2013/12/12 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
营业员岗位职责
2015/02/11 职场文书
廉洁自律个人总结
2015/02/14 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
导游词之海南天涯海角
2019/12/05 职场文书