With react-navigation
, you can do that in 2 steps:
Add listeners in componentDidMount
or componentWillMount
, to hook events
Remove listeners in componentWillUnmount
, to avoid unexpected calling
API Reference Documents v3.x, v4.x, v5.x :
React-navigation v3.x, v4.x:
addListener
- Subscribe to updates to navigation lifecycle
React Navigation emits events to screen components that subscribe to
them:
willFocus
- the screen will focus
didFocus
- the screen focused (if there was a transition, the transition completed)
willBlur
- the screen will be unfocused
didBlur
- the screen unfocused (if there was a transition, the transition completed)
React-navigation 3.x, 4.x example:
const didBlurSubscription = this.props.navigation.addListener(
'didBlur',
payload => {
console.debug('didBlur', payload);
}
);
// Remove the listener when you are done
didBlurSubscription.remove();
Ref v4.x https://reactnavigation.org/docs/4.x/navigation-prop/#addlistener---subscribe-to-updates-to-navigation-lifecycle
UPDATED v5.x
The events had been changed in v5.x
Screens can add listeners on the
navigation prop like in React Navigation. By default, there are 2
events available:
- focus - This event is emitted when the screen comes into focus
- blur - This event is emitted when the screen goes out of focus
- state (advanced) - This event is emitted when the navigator's state changes
Sample code from reactnavigation.org
class Profile extends React.Component {
componentDidMount() {
this._unsubscribe = navigation.addListener('focus', () => {
// do something
});
}
componentWillUnmount() {
this._unsubscribe();
}
render() {
// Content of the component
}
}
Use with hook
function Profile({ navigation }) {
React.useEffect(() => {
const unsubscribe = navigation.addListener('focus', () => {
// do something
});
return unsubscribe;
}, [navigation]);
return <ProfileContent />;
}
Listeners prop on Screen
<Tab.Screen
name="Chat"
component={Chat}
listeners={({ navigation, route }) => ({
tabPress: e => {
// Prevent default action
e.preventDefault();
// Do something with the `navigation` object
navigation.navigate('AnotherPlace');
},
})}
/>
Ref v5.x: https://reactnavigation.org/docs/navigation-events
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…