iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
Modern Web

初學者前端應用30天系列 第 11

[DAY11]vue 元件傳值

  • 分享至 

  • xImage
  •  

基本觀念

我們今天要介紹的是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>

上一篇
[DAY10]vue filter 過濾器
下一篇
[DAY12] js 陣列常用語法(上) 12
系列文
初學者前端應用30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言