37
Vue 3 學習之旅
元件系統

emit 的型別與驗證機制

·6 分鐘閱讀·元件系統

摘要

與 props 類似,emit 也支援型別檢查和驗證機制。這可以確保子元件發送的事件資料符合父元件的預期,提高程式碼的可靠性。

定義與說明

型別檢查:

使用物件語法定義 emit 時,可以指定每個事件的參數型別。這樣可以在開發時期就捕捉到型別錯誤。

驗證機制:

可以為每個事件定義一個驗證函數,在事件觸發時檢查參數是否符合要求。如果驗證失敗,Vue 會在開發模式下發出警告。

實作範例

TodoItem.vue
<script setup>
const emit = defineEmits({
  // 基本型別檢查
  'update': (newStatus) => {
    if (!newStatus || typeof newStatus !== 'string') {
      console.warn('update 事件必須提供字串型別的狀態');
      return false;
    }
    return true;
  },

  // 複雜的驗證邏輯
  'submit': (payload) => {
    if (!payload || typeof payload !== 'object') {
      console.warn('submit 事件必須提供一個物件');
      return false;
    }

    const { title, completed } = payload;
    
    if (!title || typeof title !== 'string') {
      console.warn('title 必須是非空字串');
      return false;
    }

    if (typeof completed !== 'boolean') {
      console.warn('completed 必須是布林值');
      return false;
    }

    return true;
  }
});

function updateStatus() {
  emit('update', 'completed'); // ✅ 通過驗證
  emit('update', 123); // ❌ 驗證失敗
}

function submitTodo() {
  emit('submit', {
    title: '完成作業',
    completed: false
  }); // ✅ 通過驗證

  emit('submit', {
    title: '',
    completed: 'yes'
  }); // ❌ 驗證失敗
}
</script>

<template>
  <div class="todo-item">
    <button @click="updateStatus">更新狀態</button>
    <button @click="submitTodo">提交待辦</button>
  </div>
</template>

結論

為 emit 事件添加型別檢查和驗證機制,可以讓元件間的通訊更加安全可靠。這些檢查在開發階段就能發現潛在的問題,避免它們在生產環境中造成意外。同時,這些定義也能作為元件的文件,幫助其他開發者正確使用你的元件。

型別檢查 驗證機制 開發安全