我可以看到本机组件的生命周期。componentDidMount,UNSAFE_componentWillMount等我以为当屏幕恢复时,UNSAFE_componentWillMount被调用了。但这不是所谓的。我使用Reactive17over,ResiveNative0.68.1,并使用navigation.goBack()从第二个屏幕返回到第一个屏幕。当屏幕恢复时,哪个函数被调用?或者有什么别的方法可以做到呢?
发布于 2022-05-18 19:55:55
你在这里要小心点。在react-native中是一个屏幕remains mounted on navigation。这个与网络不同。
如果您是从web背景来响应导航,您可能会假设当用户从路由A导航到路由B时,A将卸载(其componentWillUnmount被调用),而A将在用户返回时再次挂载。虽然这些are生命周期方法仍然有效,并且用于React导航,但它们的用法与web不同。
因此,如果您通过goBack导航,将不会再次调用componentWillMount,因为屏幕remains mounted。对于这个问题,这在这里的一节中有记录。有一个通用的解决方法。
对于functional components,我们可以使用useFocusEffect挂钩,如下所示。
useFocusEffect(
React.useCallback(() => {
// Do something when the screen is focused
return () => {
// Do something when the screen is unfocused
// Useful for cleanup functions
};
}, [])
);对于class components,我们可以使用focus listener。我是记录在这里。
class SomeClassComponent extends React.Component {
componentDidMount() {
this._unsubscribe = navigation.addListener('focus', () => {
// do whatever
});
}
componentWillUnmount() {
this._unsubscribe();
}
...在某些情况下,仍然使用功能组件可能更方便。我们可以简单地将遗留类组件包装到功能组件中,如下所示。
const Wrapper = () => {
// useFocusEffect from above.
return <SomeClassComponent />
}发布于 2022-05-18 19:08:45
在本机响应中,当您更改屏幕并返回到前一个屏幕时,它不会改变用户,因此使用useEffect钩子不起作用。但是,您可以使用react导航提供的useFocusEffect钩子。您可以更详细地阅读这里
https://stackoverflow.com/questions/72294623
复制相似问题