iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
Modern Web

「VR 」前端後端交響曲 - 30天開發 Vue.js feat. Ruby on Rails即時互動網站系列 第 10

[VR 前後端交響曲Day10] Vue元件裡由內而外的事件單向傳遞: $emit

  • 分享至 

  • xImage
  •  

元件間的資料傳遞可以說是Vue的大重點之一。
第8天第9天介紹了由外層父元件傳給子元件,
而今天要來說說如何把子元件由內到外進行「事件的單向傳遞」傳給父元件的Vue instance。

來!先跟我一起記一下口訣~

  • 由外而內props
  • 由內而外emit

以下是今天在Rails app練習時做出的頁面:
當我按下子元件的按我,送出Emit按鈕的時候,會將this.$emit('news');送出去。

Step1. 子元件的methods: $emit('自訂事件名稱')

在UI使用Vue元件時,透過@click='自訂事件名稱'的事件綁定,
按鈕被按下後,會emit傳遞自訂的news事件給父層元件。

News.vue

<template>
  <div class="news">
    <h1>本日重點:{{ message }}</h1>
    <button class="news-btn" @click="clickNews">按我,送出Emit</button>
  </div>
</template>

<script>
  export default {   
    data: function () {
      return {
        message: "由內層到外層元件的單向資料流:在子元件利用$emit('自訂事件名稱')送出事件給父元件"
      }
    },
    methods: {
      clickNews(){
        this.$emit('news');
      }
    }
  }
</script>

Step2. 在Vue Root掛載點,接收傳出來的事件

我在News元件上使用<News v-on:news="rootMethod"></News> 語法,讓父層接收了子元件傳出的事件方法news

home.html.erb

<div id="content">
  <div class="main-title">Vue.js x Rails第12屆鐵人賽專案:{{ day }}</div>
  <div class="main-body">本日主題:{{ topic }}</div>

  <News v-on:news="rootMethod"></News>    
  <Foot></Foot>
</div>

Step3. 父元件接收事件後,執行rootMethod()方法

在本日的鐵人賽是透過console.log印出子元件送出事件,傳給父元件這段話,
作為成功傳給Root元件的證據~
home.js

import TurbolinksAdapter from 'vue-turbolinks'
import Vue from 'vue/dist/vue.esm'
import News from "../components/news"
import Foot from "../components/foot"


Vue.use(TurbolinksAdapter)

document.addEventListener('turbolinks:load', () => {
  let el = document.querySelector("#content");

  if (el){
    new Vue({
      el,
      data: {
        day: "第 10 天",
        topic: "元件的溝通 - emit",
      },
      methods: {
        rootMethod(){
          console.log("子元件送出事件,傳給父元件")
        }
      },
      components: { News, Foot }
    })    
  }
})

emit完成圖

到第十天了耶~1/3了,可喜可賀!
為了之後進行Rails專案得以更順利,花了不少時間與篇幅在理解及研究元件間的的data-flow。

明天來試試用$emit的特性,做個簡單的to-do list吧!
也許以後再回來看這個系列,會懷念2020的秋天鐵人賽,每天晚上都與Vue.js搏鬥的日子:)

Ref:


上一篇
[VR 前後端交響曲Day9] 由外到內:Vue元件裡的props屬性(2)
下一篇
[VR 前後端交響曲Day11] Vue元件單向傳遞: $emit 製作todo list
系列文
「VR 」前端後端交響曲 - 30天開發 Vue.js feat. Ruby on Rails即時互動網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言