總結一下對vue組件通訊的理解和使用。
<template> <div id="app"> <p>請輸入單價: <input type="text" v-model="price"></p> <page1 :price="price" @downPrice="downPrice"></page1> <page2></page2> </div> </template> <script> import Page1 from "./components/page1"; import Page2 from "./components/page2"; export default { name: "App", data() { return { price: "" }; }, components: { Page1, Page2 }, methods: { downPrice() { this.price = (this.price - 1).toString(); } } }; </script>
<template> <div> <p><span>單價:</span><span>{{price}}</span> <button @click="downPrice">降價1元</button></p> <p>數量: {{count}} </p> </div> </template> <script> import bus from '../eventBus.js' export default { props:{ price:{ type:String, default:'' } }, data(){ return{ count:10 } }, methods:{ downPrice(){ this.$emit('downPrice') } }, watch:{ price(newPrice){ bus.$emit('priceChange',newPrice,this.count) } } } </script>
<template> <div> <p> <span>總金額:{{totalMoney}}元 </span>剩餘金額: <span>{{balance}}元</span> </p> </div> </template> <script> import bus from "../eventBus.js"; export default { data() { return { balance: 1000, totalMoney: 1000 }; }, mounted() { bus.$on("priceChange", (price, count) => { this.balance = this.totalMoney - price * count; }); } }; </script>
import Page1 from "./components/page1";
components
中註冊該子組件components: { Page1 }
template
中使用子組件<page1></page1>
v-bind(若是傳遞的是固定值,則不須要v-bind,直接屬性名,屬性值傳遞便可)
。<page1 :price="price"></page1> // 此處的price則是傳遞給子組件的值
props
屬性接收傳遞過來的值props:{ price:{ type:String, default:'' } }
<p><span>單價:</span><span>{{price}}</span></p>
downPrice
方法),<p><span>單價:</span><span>{{price}}</span> <button @click="downPrice">降價1元</button></p>
methods
的downPrice
中,經過this.$emit()
,將事件和參數傳遞給父組件downPrice(count){ this.$emit('downPrice',count) } // downPrice 是傳遞給父組件的事件,父組件觸發並相應這個方法 // count 傳遞給父組件的參數,在父組件中,能夠對和這個參數進行相應操做
downPrice
和數據<page1 :price="price" @downPrice="downPrice"></page1>
downPrice(count) { this.price = (this.price - 1).toString(); // this.price = (this.price - count).toString(); }
方法一:
html
ref
引用<page1 :price="price" @downPrice="downPrice" ref="page1"></page1>
this.$refs
便可找到該子組件,也能夠操做子組件的方法this.$refs.page1.子組件方法
打印出獲取到的子組件信息:vue
方法二:
git
$children
,能夠獲取到全部子組件的集合this.$children[0].某個方法
$parent
能夠找到父組件,進而調用其方法this.$parent.父組件方法
打印出的父組件信息
github
同級組件不能直接傳值,須要一箇中間橋樑,能夠先將數據傳遞給公共的父組件,而後父組件再將數據傳遞給須要的子組件。vuex
eventBus.js
代碼很簡單(就2句),只是建立一個空的vue實例app
import Vue from 'vue' export default new Vue()
eventBus.js
文件import bus from '../eventBus.js'
$emit
將事件和參數傳遞給page2.vueprice(newPrice){ bus.$emit('priceChange',newPrice,this.count) }
$on
接收接收參數和相應事件bus.$on("priceChange", (price, count) => { this.balance = this.totalMoney - price * count; });
通常大型的項目,推薦使用Vuex來管理組件之間的通訊
若是對道友你有幫助,請收藏和點贊,若是以爲有問題,歡迎留言指出,demo查看this