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 为每个生命周期方法导出钩子,您可以在函数组件中使用这些钩子。每个钩子都接受您希望在事件触发时调用的方法。
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 包装。
开发人员还可以选择向每个生命周期钩子传递响应式依赖项。然后将其传递给底层的 React useEffect 钩子
const [data, setData] = useState('foo');
useIonViewDidEnter(() => {
console.log('ionViewDidEnter event fired');
}, [data]);
React 生命周期方法
React 中的所有生命周期方法(componentDidMount
、componentWillUnmount
等)都可以供您使用。但是,由于 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 }