通訊方式 | 區別 |
---|---|
props | 用於父組件傳遞數據給子組件 |
自定義事件 | 用於子組件向父組件通訊 |
eventBus | 適用於非父子組件通訊的簡單場景,使用一個空的vue實例做爲中央事件總線 |
Vuex | 狀態管理,適用於複雜場景 |
父組件傳遞數據給子組件:
1.子組件顯示地用props選項申明得到的數據:javascript
export default { name: 'vheader', props:['myMessage','myData'], }
2.父組件傳遞數據html
<v-header my-message="vue2.0" my-data="propsdownData"></v-header>
至此,子組件將獲取到數據vue2.0
和porpsdownData
vue
每一個vue實例都實現了事件接口:java
//App.vue 父組件 <template> <div id=」counter-event-example」> <p>{{ total }}</p> <button-counter v-on:increment=」incrementTotal」></button> </div> </template> import buttonCounter from ‘./buttonCounter.vue’ exoprt default{ name:’app’, data(){ return{ Counter:0 } }, componts:{ buttonCounter:buttonCounter }, methods(){ incrementTotal(){ This.total += 1 } } }
//buttonCounter.vue 子組件 <template> <div> <button @click=」incrementCounter」>點擊觸發父組件事件</button> </div> </template> exoprt default{ name:’buttonCounter’, methods(){ incrementCounter(){ this.$emit(‘increment’) } } }
注意點
1.每次父組件更新,子組件全部prop會更新爲最新值。所以,不能在子組件內部改變prop,若是作了,vue會在控制檯給出警告。
2.注意在 JavaScript 中對象和數組是引用類型,指向地址,若是 prop 是一個對象或數組,在子組件內部改變它會影響父組件的狀態。es6
1.建立中央事件總線eventbus.js:vuex
import Vue from 'vue' export default new Vue()
2.建立v-component-a.vue子組件數組
<template> <div class="box"> <h3>子組件A(event bus)</h3> <el-button style="margin-top:10px" type="primary" @click="touchCompontB">點擊我觸發子組件B的事件</el-button> </div> </template> <script> import eventbus from '../eventbus.js' export default { name: 'box', data () { return { name: '' } }, methods:{ touchCompontB(){ eventbus.$emit('getName',['子組件b']) } }, } </script>
3.建立v-component-b.vue子組件app
<template> <div class="box"> <h3>子組件B {{name}}</h3> <el-button style="margin-top:10px" type="primary" @click="getMyMsg('本身')">點擊我觸發本身組件的事件</el-button> </div> </template> <script> import eventbus from '../eventbus.js' export default { name: 'box', data () { return { name: '' } }, methods:{ getMyMsg(arg){ let msg="觸發了"+arg+"組件的方法" alert(msg) } }, created(){ eventbus.$on('getName',(arg)=>{ this.getMyMsg(arg) }) } } </script>
4.在父組件註冊兩個子組件函數
<template> <div id="app"> <div class="parentCpt"> <div class="clear" style="width:100%"> <div style="float:left;" class="cptWrap"> <v-component-a></v-component-a> </div> <div style="float:right" class="cptWrap"> <v-component-b></v-component-b> </div> </div> </div> </div> </template> <script> import vComponentA from './components/v-component-a.vue' import vComponentB from './components/v-component-b.vue' export default { name: 'app', components:{ vComponentA:vComponentA, vComponentB:vComponentB } } </script>
注意點:this
eventbus.$on('getName',(arg)=>{ this.getMyMsg(arg) })
若寫成es6的箭頭函數,則直接寫this,不然須要先在eventbus.$on以前將this賦值給let self=this;