跳至主要內容
版本:v8

React 生命週期

本指南討論如何在 Ionic React 應用程式中使用 Ionic 生命週期事件。

Ionic 生命週期方法

Ionic 提供了一些您可以在應用程式中使用的生命週期方法

事件名稱描述
ionViewWillEnter在元件即將動畫顯示時觸發。
ionViewDidEnter在元件動畫顯示完成時觸發。
ionViewWillLeave在元件即將動畫移開時觸發。
ionViewDidLeave在元件動畫移開完成時觸發。

這些生命週期僅在由路由器直接映射的元件上呼叫。這表示如果 /pageOne 對應到 PageOneComponent,則 Ionic 生命週期將在 PageOneComponent 上呼叫,但不會在 PageOneComponent 可能呈現的任何子元件上呼叫。

您存取這些方法的方式會因您使用的是基於類別的元件還是函式元件而異。我們在下面涵蓋這兩種方法。

基於類別的元件中的生命週期方法

若要在基於類別的元件中使用 Ionic 生命週期方法,您必須使用 withIonLifeCycle 高階元件 (HOC) 包裝您的元件,如下所示

export default withIonLifeCycle(HomePage);
注意

withIonLifeCycle 是從 @ionic/react 匯入的

然後您可以在類別元件上建立適當的生命週期方法,當事件發生時,HOC 會呼叫該方法。下面是包含每個生命週期方法的完整元件

import React from 'react';
import { IonHeader, IonPage, IonToolbar, IonTitle, IonContent, withIonLifeCycle } from '@ionic/react';

class HomePage extends React.Component {
ionViewWillEnter() {
console.log('ionViewWillEnter event fired');
}

ionViewWillLeave() {
console.log('ionViewWillLeave event fired');
}

ionViewDidEnter() {
console.log('ionViewDidEnter event fired');
}

ionViewDidLeave() {
console.log('ionViewDidLeave event fired');
}

render() {
return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>Home</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent></IonContent>
</IonPage>
);
}
}

export default withIonLifeCycle(HomePage);

函式元件中的生命週期方法

Ionic React 為每個生命週期方法匯出 hooks,您可以在函式元件中使用這些 hooks。每個 hook 都會接受您希望在事件觸發時呼叫的方法。

import {
IonContent,
IonHeader,
IonTitle,
IonToolbar,
useIonViewDidEnter,
useIonViewDidLeave,
useIonViewWillEnter,
useIonViewWillLeave,
} from '@ionic/react';
import React from 'react';

const HomePage: React.FC = () => {
useIonViewDidEnter(() => {
console.log('ionViewDidEnter event fired');
});

useIonViewDidLeave(() => {
console.log('ionViewDidLeave event fired');
});

useIonViewWillEnter(() => {
console.log('ionViewWillEnter event fired');
});

useIonViewWillLeave(() => {
console.log('ionViewWillLeave event fired');
});

return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>Home</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent></IonContent>
</IonPage>
);
};

export default HomePage;
注意

函式元件不需要像類別元件一樣用 withIonLifeCycle HOC 包裝。

開發人員也可以選擇性地將反應式依賴性傳遞給每個生命週期 hook。然後,這些依賴性會傳遞給底層的 React useEffect hook

const [data, setData] = useState('foo');

useIonViewDidEnter(() => {
console.log('ionViewDidEnter event fired');
}, [data]);

React 生命週期方法

React 中的所有生命週期方法 (componentDidMountcomponentWillUnmount 等) 也可供您使用。但是,由於 Ionic React 管理頁面的生命週期,因此某些事件可能不會在您預期的時間觸發。例如,componentDidMount 會在首次顯示頁面時觸發,但如果您導覽離開頁面,Ionic 可能會將頁面保留在 DOM 中,並且後續造訪該頁面可能不會再次呼叫 componentDidMount。這種情況是 Ionic 生命週期方法存在的主要原因,它仍然為您提供了一種在原生框架的事件可能不觸發時,在檢視進入和退出時呼叫邏輯的方法。

每個生命週期方法的指導

以下是一些關於每個生命週期事件的使用案例的提示。

  • ionViewWillEnter - 由於 ionViewWillEnter 會在每次導覽至檢視時呼叫 (無論是否已初始化),因此它是從服務載入資料的好方法。
  • ionViewDidEnter - 如果您在載入資料時發現使用 ionViewWillEnter 會產生效能問題,您可以改在 ionViewDidEnter 中進行資料呼叫。但是,此事件直到頁面對使用者可見後才會觸發,因此您可能需要使用載入指示器或骨架畫面,這樣內容才不會在轉換完成後以不自然的方式閃爍。
  • ionViewWillLeave - 可用於清理,例如取消訂閱資料來源。由於當您從目前頁面導覽時 componentWillUnmount 可能不會觸發,如果您不希望當畫面不在檢視中時它處於啟用狀態,請將您的清理程式碼放在這裡。
  • ionViewDidLeave - 當此事件觸發時,您知道新頁面已完全轉換,因此任何您在檢視可見時通常不會執行的邏輯都可以放在這裡。

在頁面之間傳遞狀態

由於 Ionic React 管理頁面的生命週期,因此當使用者導覽您的應用程式時,先前頁面的狀態可能會更新。這可能會影響使用 React 的 useEffect 或 React Router 的 useLocation 判定的狀態。例如,如果 PageA 呼叫 useLocation,當使用者從 PageA 導覽至 PageB 時,useLocation 的狀態將會變更。

開發人員應包含適當的檢查,以確保先前的頁面僅存取已定義的狀態。

例如,如果未定義 testObject,則下列程式碼將會產生錯誤:{ state.testObject.childKey }

相反地,開發人員應僅在定義 testObject 時存取 childKey{ state.testObject?.childKey }