# vue元件傳值 11
###### tags: `vue`
# 基本觀念
我們今天要介紹的是vue元件(component)傳值,包括父傳子、子傳父和兄弟互傳,在實現元件互傳之前,我們要先來解釋父子元件關係,現在有a、b兩個元件,a引入了b元件,那a就是b的父元件,b就是a的子元件。而兄弟元件互傳的概念則比較複雜,現在有c、d、e三個元件,c引入了d和e元件,那d和e就是兄弟關係,若d要把值傳到e,要先把值傳到他們共同的父元件c,再傳到e元件。以上就是元件傳值的概念,接下來就是實做的部分。
# 父傳子
### step 1
首先我們先創兩個元件home 和 kkk元件並把他們放在相應的資料夾,先在home裡面引入kkk
### step 2
在 home的data 裡新增一筆變數tok,給值"預設值123",並在元件標籤內放入 :msg="tok",冒號為v-bind的縮寫,綁定tok,msg為傳過去的名稱,tok就是我們剛才設定的data
### step 3
在要接受父元件傳值的元件(kkk)用prop接傳送過來的值,並定義型態string,然後在template放上訊息名稱,就可以看到傳過來的值了
### step 4
若要動態修改父元件傳到子元件的值,只需在父元件加input輸入框,裡面放v-model:tok,傳入子元件的值就能隨著輸入框做更改
以下是程式碼
home.vue
```
<template>
<div class="home">
<input v-model="tok">
<kkk :msge="tok" />
</div>
</template>
<script>
// @ is an alias to /src
import kkk from '@/components/kkk.vue'
export default {
name: 'Home',
data:()=>({
tok: "預設值123",
}),
components: {
kkk
},
methods:{
}
}
</script>
```
kkk.vue
```
<template>
<div >
這是子元件:{{msge}}
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data:()=>({
}),
props: {
msge: String
},
mounted(){
},
methods:{
}
}
</script>
```
# 子傳父
### step 1
首先我們先創兩個元件about 和 ppp元件並把他們放在相應的資料夾,先在about裡面引入ppp
### step 2
切換到ppp,新增一個名為ktop的data,之後在created裡輸入 this.$emit(“top”,this.ktop),emit算是送出事件的函數,top為此事件的名稱,this.ktop是我們要傳的值。
### step 3
在about元件中ppp標籤裡輸入 @top="appear",@是v-on的縮寫,用來監聽top事件的發生,appear為自定義的函數名稱在監聽到top事件會觸發,之後在methods裡新增appear函數在裡面console.log,就可以達到子傳父元件的效果了
### step 4
如果想要動態傳遞效果可以在ppp增加input和button標籤,input用v-model綁定ktop,button觸發emit事件,就可以達到動態傳遞效果
以下是程式碼
about.vue
```
<template>
<div class="home">
<ppp @top="appear" />
{{onon}}
</div>
</template>
<script>
/* eslint-disable */
import ppp from '@/components/ppp.vue'
export default {
name: 'Home',
data:()=>({
onon : ""
}),
components: {
ppp
},
methods:{
appear(data){
console.log(data)
this.onon=data
}
}
}
</script>
```
ppp.vue
```
<template>
<div >
<input v-model="ktop" type="text">
<button @click="send">按下候傳到父元件</button>
</div>
</template>
<script>
/* eslint-disable */
export default {
name: 'ppp',
data:()=>({
ktop:"wantzzzzz"
}),
props: {
},
methods:{
send(){
this.$emit("top",this.ktop)
}
}
}
</script>
```
# 兄弟互傳
### step 1
兄弟元件互傳其實就是父傳子和子傳父的結合,首先我們先創三個元件broa、brob和brother元件並把他們放在相應的資料夾,先在brother裡面引入broa、brob
### step 2
在broa裡新增data名稱為age,並在created裡新增一個送出事件,名稱為broatob,值為age
### step 3
先在brother元件中,新增一個data名為atob,用來接收broa傳過來的值,再brother元件中broa標籤裡輸入@broatob=”getbro a”,之後在methods裡新增getbroa函數在裡面打 this.atob=data,就能讓atob等於broa傳過來的值了
### step 4
在brother元件裡的brob標籤裡打 :msg=”atob” ,就可以把atob送給brob元件了
### step 5
在brob元件裡用prop接brother傳來的值,並設定型態,再顯示再畫面上,就能達到broa元件傳到brob元件兄弟互傳的效果了
### step 6
如果想要動態傳遞效果可以在broa增加input和button標籤,input用v-model綁定age,button觸發emit事件,就可以達到動態傳遞效果
以下是程式碼
brother.vue
```
<template>
<div>
<broa @broatob="getbroa" />
<brob :msg="atob" />
</div>
</template>
<script>
/* eslint-disable */
import broa from '@/components/broa.vue'
import brob from '@/components/brob.vue'
export default {
data:()=>({
atob:""
}),
components: {
brob,broa
},
methods:{
getbroa(data){
console.log(data)
this.atob = data
},
}
}
</script>
```
broa.vue
```
<template>
<div>
<input v-model="age" type="text">
<button @click="send">按下後兄弟傳值</button>
</div>
</template>
<script>
/* eslint-disable */
export default {
data:()=>({
age:"13year"
}),
props: {
},
methods: {
send(){
this.$emit("broatob",this.age)
}
},
}
</script>
```
brob.vue
```
<template>
<div>
{{msg}}
</div>
</template>
<script>
/* eslint-disable */
export default {
props: {
msg: String
}
}
</script>
```