---
# System prepended metadata

title: vue元件傳值 11
tags: [vue]

---

# 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>
```