Vue实现简易购物车 父子组件传值
2020-06-29 04:43
405 查看
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .wrap{ width: 200px; margin: 0 auto; } .title,.footer{ background-color: #eee; height: 40px; text-align: center; line-height: 40px; } .footer span{ color: red; } .footer button{ width: 60px; height: 30px; margin: 0 10px; } .item{ height: 55px; line-height: 55px; position: relative; vertical-align: middle; } .item .name{ position: absolute; left: 10px; top: 0; } .item .change{ position: absolute; right: 30px; top: 0; } .change input { width: 40px; text-align: center; } .change a{ text-decoration: none; font-size: 22px; color: #000; } .item .remove{ position: absolute; top: 0; right: 0; font-size: 25px; color: red; cursor: pointer; } </style> </head> <body> <div id="app"> <my-cart></my-cart> </div> </body> <script src="node_modules/vue/dist/vue.js"></script> <script> let CartTitle = { template:` <div class="title">购物车</div> ` } let CartFooter = { props:['list'], template:` <div class="footer"> <span>金额:{{getSum}}</span> <button>结算</button> </div> `, computed: { getSum(){ let sum = 0 this.list.some(item =>{ sum += item.price * item.num }) return sum } }, } let CartList = { props:['list'], template:` <div> <div class="item" :key="item.id" v-for="item in list"> <div class="name">{{item.uname}}</div> <div class="change"> <a href="JavaScript:;" @click="sub(item.id)">-</a> <input type="text" class="num" v-model="item.num" @blur="changeNum(item.id,$event)" /> <a href="JavaScript:;" @click="add(item.id)">+</a> </div> <div class="remove" @click="del(item.id)">×</div> </div> </div> `, methods: { //商品删除按钮 del(id){ this.$emit('del-cart',id) }, //商品增加按钮 add(id){ this.$emit('change-num',{ id:id, flag:'add' }) }, //商品减少按钮 sub(id){ this.$emit('change-num',{ id:id, flag:'sub' }) }, //表单发生改变 changeNum(id,event){ this.$emit('change-num',{ id:id, flag:'change', num:event.target.value }) } } } Vue.component('my-cart',{ template:` <div class="wrap"> <cart-title></cart-title> <cart-list :list="list" @del-cart="delCart" @change-num="changeNum"></cart-list> <cart-footer :list="list"></cart-footer> </div> `, data(){ return{ //商品数据表 list:[{ id:1, uname:'华为P30', price:3000, num:1 },{ id:2, uname:'小米10', price:2000, num:1 },{ id:3, uname:'扫地机', price:500, num:1 },{ id:4, uname:'电视剧', price:1000, num:1 }] } }, methods: { delCart(id){ //拿到子组件想要删除的商品id let cartId = this.list.findIndex(item =>{ return item.id === id }) this.list.splice(cartId,1) }, //修改商品数量方法 changeNum(obj){ if(obj.flag ==='add'){ this.list.some(item =>{ if(item.id === obj.id){ item.num++ return true } }) }else if(obj.flag === 'sub'){ this.list.some(item =>{ if(item.id === obj.id){ item.num >0 ?item.num-- :0 return true } }) }else if(obj.flag === 'change'){ this.list.some(item =>{ if(item.id === obj.id){ item.num = obj.num return true } }) } } }, components:{ 'cart-title':CartTitle, 'cart-footer':CartFooter, 'cart-list':CartList } }) new Vue({ el:'#app' }) </script> </html>
相关文章推荐
- Vue 使用Props属性实现父子组件的动态传值
- Vue 使用Props属性实现父子组件的动态传值详解
- vue 父子组件传值
- vue实现父子组件之间的通信以及兄弟组件的通信功能示例
- Vuejs 实现简易 todoList 功能 与 组件实例代码
- vue-父子组件传值
- Vue教程(组件-父子组件传值)
- **Vue父子组件之间传值:*
- 浅谈vue父子组件怎么传值
- Vue2.0的三种常用传值方式、父传子、子传父、非父子组件传值
- Vue父子组件通讯传值
- vue父子组件传值
- vue 中父子组件相互传值
- vue基础父子组件输入动态传值
- 探索vue父子组件实现数据双向绑定失败的原因
- vue父子组件实时传参实现批量下载
- vue非父子组件传值
- @用Vue组件实现购物车复选框功能模块
- Vue中的父子组件传值从父组件控制子组件的显示
- vue.js2.0父子组件间传参 (一)实现弹窗