我使用React Navigation x5,我有StackNavigator
,它正在加载一堆屏幕。我想卸载blur上的一个特定屏幕组件,以便在使用DrawerNavigator
时获得与使用unmountOnBlur
相同的结果。
我怎样才能做到这一点?
自5.x
以来,目前有三种方法可以做到这一点。你可以选择
- 使用
useFocusEffect
挂钩触发操作(推荐(,或 - 使用
useIsFocused
挂钩,或 - 收听
focus
事件
useFocusEffect
示例import { useFocusEffect } from '@react-navigation/native';
function Sample(props) {
const [shouldHide, setShouldHide] = React.useState(false);
useFocusEffect(() => {
setShouldHide(false)
return () => {
setShouldHide(true)
}
});
return shouldHide ? null : <InnerComponent {...props} />;
}
useIsFocused
钩子的示例
import * as React from 'react';
import { Text } from 'react-native';
import { useIsFocused } from '@react-navigation/native';
function Profile() {
// This hook returns `true` if the screen is focused, `false` otherwise
const isFocused = useIsFocused();
return {isFocused ? <Text>Inner component</Text> : null};
}
注:
使用这个钩子组件可能会在屏幕进入和离开焦点时引入不必要的组件重新渲染。。。因此,我们建议仅在需要触发重新渲染时才使用此挂钩。
更多信息可以在文档中找到当聚焦屏幕更改时调用函数
除此之外,堆栈导航器还附带一个名为detachInactiveScreens
的道具,该道具在默认情况下处于启用状态。文档链接
detachInactiveScreens
用于指示是否应将非活动屏幕从视图层次结构中分离以节省内存的布尔值。确保从
react-native-screens
调用enableScreens
以使其工作。默认为true
。
(有关启用React Native Screens的说明,请访问https://reactnavigation.org/docs/react-native-screens/#setup-当你使用expo(
在堆栈导航器的options
对象中,还有一个detachPreviousScreen
道具,用于自定义某些屏幕的行为。通常也会启用此选项。
detachPreviousScreen
用于指示是否从视图层次结构中分离上一个屏幕以节省内存的布尔值。如果您需要通过活动屏幕查看上一个屏幕,请将其设置为
false
。仅适用于detachInactiveScreens
未设置为false的情况。当最后一个屏幕为mode='modal'
时,默认为false
,否则为true
。