iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
Vue.js

Vue3 - 從零開始學系列 第 16

Vue3 - 從零開始學 - Day16 - 元件更新

  • 分享至 

  • xImage
  •  

在上一個單元是將元件傳出資料給上層,但還是必須要透過一個按鈕才可以觸發事件,能不能有自動偵測的方式做到?

這個單元就要來繼續討論元件,元件可以自動把資料傳出給上層。

首先宣告一個元件檔案 components/Input.vue:

<template>
  <input type="text" />
</template>

<script>
export default {
  name: 'Input',
};
</script>

要將資料自動傳出,必須要宣告 props:

<template>
  <input type="text" />
</template>

<script>
export default {
  name: 'Input',
  props: {
    modelValue: String, // modelValue 為系統名稱,不能自由命名
  },
};
</script>

這裡要注意的是 modelValue 為系統名稱,不能自由命名。

接著在 input 內宣告 :value 指定這個 modelValue,等於是先將 input 內輸入的資料暫存起來。然後再透過
@input="$emit('update:modelValue', $event.target.value)" 這一段長長的指令將內容更新給上層。

<template>
  <input
    type="text"
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

<script>
export default {
  name: 'Input',
  props: {
    modelValue: String,
  },
};
</script>

$emit 可以在元件內發出事件,而這裡帶入的事件就是 update:modelValue ,也就是表示當 modelValue 被更新時,會觸發這個事件,最後再使用 @input 來偵測是否有輸入內容。

回到 App.vue,宣告一個變數 name,然後直接使用 v-model 來綁定元件與變數 name 即可。

<template>
  {{ name }}
  <Input v-model="name" />
</template>

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

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

今日程式碼範例

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


上一篇
Vue3 - 從零開始學 - Day15 - 元件數值傳出
下一篇
Vue3 - 從零開始學 - Day17 - 元件 slot
系列文
Vue3 - 從零開始學31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言