iT邦幫忙

2023 iThome 鐵人賽

DAY 15
1
Vue.js

Vue3 - 從零開始學系列 第 15

Vue3 - 從零開始學 - Day15 - 元件數值傳出

  • 分享至 

  • xImage
  •  

在上一個單元,學習到了如何從上層傳資料給子元件,也就是由上而下,但有得時候會需要有下而上,也就是從子元件傳資料給上層。

這個單元會將表單的輸入框,切成元件後,傳出輸入框所輸入的資料給上層。

首先先宣告好表單的輸入框,這裡的宣告在之前 Day8 有詳細的介紹:

<template>
  <div>
    <input type="text" v-model="text" />
    <button>Send</button>
  </div>
</template>

<script>
export default {
  name: 'View',
  data() {
    return {
      text: '',
    };
  },
};
</script>

將以上的程式碼儲存成在 components/View.vue。

然後在 App.vue 引用這個元件:

<template>
  <View />
</template>

<script>
import View from './components/View.vue';

export default {
  name: 'App',
  components: {
    View,
  },
};
</script>

接下來回到 components/View.vue,要從元件內傳資料給上層,要先宣告 emits:

emits: ['viewText']

宣告一個 emits ,給予一個陣列,裡面有一個變數 viewText。

然後在表單的按鈕呼叫這個 emits 內的變數,並且把資料傳入:

<button @click="$emit('viewText', text)">Send</button>

組合起來:

<template>
  <div>
    <input type="text" v-model="text" />
    <button @click="$emit('viewText', text)">Send</button>
  </div>
</template>

<script>
export default {
  name: 'View',
  emits: ['viewText'],
  data() {
    return {
      text: '',
    };
  },
};
</script>

接下來再度回到 App.vue,宣告一個變數 text 來接收元件傳出來的資料:

<template>
  <View />
  <br />
  {{ text }}
</template>

<script>
import View from './components/View.vue';

export default {
  name: 'App',
  components: {
    View,
  },
  data() {
    return {
      text: '',
    };
  },
};
</script>

最後使用一個函式 getViewText,來接收資料:

<template>
  <View @viewText="getViewText" />
  <br />
  {{ text }}
</template>

<script>
import View from './components/View.vue';

export default {
  name: 'App',
  components: {
    View,
  },
  data() {
    return {
      text: '',
    };
  },
  methods: {
    getViewText(text) {
      this.text = text;
    },
  },
};
</script>

如此一來,當按下按鈕時,元件內的表單變數 text,就可以傳出去給 App.vue 來接收了。

今日程式碼範例

Vue3 - 從零開始學 - Day15 [完]


上一篇
Vue3 - 從零開始學 - Day14 - 元件傳入參數
下一篇
Vue3 - 從零開始學 - Day16 - 元件更新
系列文
Vue3 - 從零開始學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言