Skip to content

核心生命週期實戰場景

以下是開發中最常使用的三個核心階段,我們來看看對應的程式碼該如何撰寫。

初始化與 API 請求:setup 與 onMounted

  • setup:適合用來初始化響應式變數,例如:ref()reactive() 或呼叫不依賴 DOM 的初始邏輯。
  • onMounted:此時虛擬 DOM 已轉換為實體 DOM,適合用來操作 DOM,例如:初始化網頁圖表 Chart.js 或發送非同步 API 請求。
js
const isLoading = ref(true);
const userData = ref(null);

// 1. 同步執行於 setup 階段
console.log("元件初始化開始...");

// 2. 組件掛載完成後觸發
onMounted(async () => {
  console.log("DOM 已就緒,準備撈取資料");
  try {
    const response = await fetch("/api/user/profile");
    userData.value = await response.json();
  } finally {
    isLoading.value = false;
  }
});

響應式狀態的變更觀測:onBeforeUpdate 與 onUpdated

當元件內部的響應式資料被修改時,Vue 會準備重新繪製畫面。這兩個鉤子可以讓您精準捕捉畫面重繪前與重繪後的瞬間

js
const counter = ref(0);

onBeforeUpdate(() => {
  console.log("資料已變更,但畫面(DOM)尚未重新渲染");
});

onUpdated(() => {
  console.log("畫面已完成重繪!目前的實體 DOM 已反映最新數據");
});

防止記憶體外洩:onBeforeUnmount 與 onUnmounted

當網頁切換路由或關閉特定元件時,會觸發銷毀階段。如果我們在元件內建立了全域事件監聽(如 window.addEventListener)或定時器(setInterval),必須在此階段手動清除,否則會引發記憶體外洩(Memory Leak)。

js
let timer = null;

const handleResize = () => {
  console.log("視窗大小改變中:", window.innerWidth);
};

onMounted(() => {
  // 建立全域監聽與計時器
  window.addEventListener("resize", handleResize);
  timer = setInterval(() => {
    console.log("每秒執行一次的任務...");
  }, 1000);
});

// 元件即將銷毀前,確實做好打掃工作
onBeforeUnmount(() => {
  window.removeEventListener("resize", handleResize);
  clearInterval(timer);
  console.log("全域資源已釋放");
});