042——VUE中组件之子组件使用$on与$emit事件触发父组件实现购物车功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>组件之子组件使用$on与$emit事件触发父组件实现购物车功能</title> <script src="vue.js"></script> </head> <body> <div id="hdcms"> <hd-news :listdata="goods" @sum="total"></hd-news><!--@sum的作用是把父組件的事件綁定到子組件中--> <h2>总价:{{totalPrice}}</h2> </div> <script typeof="text/x-template" id="hdNews"> <table border="2" bordercolor="black" cellspacing="0" cellpadding="20"> <tr> <td>商品名称</td> <td>价格</td> <td>数量</td> </tr> <tr v-for="(v,k) in listdata"> <td>{{v.name}}</td> <td>{{v.price}}</td> <td> <input type="text" v-model="v.num" @blur="sums"><!--失去焦点之后触发子组件绑定的事件--> </td> </tr> </table> </script> <script> var hdNews = { template: "#hdNews", props: ['listdata'],//继承父组件的数据 methods: { sums() { this.$emit('sum');//@emit的作用就是子组件呼叫父组件的事件 } } }; new Vue({ el: "#hdcms", components: {hdNews}, mounted() { //当vue执行完毕之后,去执行函数 this.total(); }, data: { totalPrice: 0, goods: [{ name: '苹果X', price: 200, num: 1 }, { name: '华为P10', price: 100, num: 1 }, { name: '小米6', price: 50, num: 1 }, ] }, methods: { total() { this.totalPrice = 0; this.goods.forEach((v) => { this.totalPrice += v.num * v.price; }); } } }); </script> </body> </html>