当前接受的答案建议使用 react-navigation 解决方案,而不是 react-native-navigation (RNN),所以我会继续给我两分钱。
正如 Stephen Liu 在他的回答中指出的那样,RNN 提供了在组件出现 ( ) 和消失 ( )时触发的屏幕生命周期方法。componentDidAppear
componentDidDisappear
Stephen 的答案适用于类组件,但是在钩子时代,我更喜欢函数组件。所以这是如何在函数组件中使用 RNN 的屏幕生命周期方法:
import React, { useEffect } from 'react'
import { Navigation } from 'react-native-navigation'
const MyComponent = ({ componentId }) => {
useEffect(() => {
const navListener = Navigation.events().bindComponent(this, componentId)
// remove the listener during cleanup
return () => {
navListener.remove()
}
}, [componentId])
this.componentDidAppear = () => {
// do stuff when component appears
}
this. componentDidDisappear = () => {
// do stuff when component disappears
}
}
重要:MyComponent
需要一个componentId
prop,如果它是注册的 RNN 屏幕或模态 ( Navigation.registerComponent
),则会自动注入。您也可以手动将其从屏幕组件传递给您需要它的子组件。
奖励:useComponentDidAppear
钩子
我在我的项目中经常使用 RNN 的 componentDidAppear,所以我制作了一个自定义钩子,以便在我的函数组件中超级轻松地重用它:
export const useComponentDidAppear = (componentId, callback) => {
useEffect(() => {
const navListener = Navigation.events().bindComponent(this, componentId)
return () => {
navListener.remove()
}
}, [componentId])
this.componentDidAppear = () => {
callback()
}
}
// then use it like this
const SomeScreen = ({ componentId }) => {
useComponentDidAppear(componentId, () => {
// do stuff when the component appears!
})
}