我正在努力将应用程序移植到React-Native来测试它。当我回到导航器堆栈中的上一个视图(点击后退按钮)时,我想运行一些代码。是否有viewWillAppear方法?我在导航器上看到有一个“onDidFocus()”回调,听起来它可能是正确的东西......但是在NavigatorIOS上似乎没有那样的东西
答案 0 :(得分:13)
我找到了一种在UIKit中模拟viewDidAppear和viewDidDisappear的方法,
但我不确定这是否是一种“正确”的方式。
componentDidMount: function() {
// your code here
var currentRoute = this.props.navigator.navigationContext.currentRoute;
this.props.navigator.navigationContext.addListener('didfocus', (event) => {
//didfocus emit in componentDidMount
if (currentRoute === event.data.route) {
console.log("me didAppear");
} else {
console.log("me didDisappear, other didAppear");
}
console.log(event.data.route);
});
},
答案 1 :(得分:2)
对于使用钩子并使用5.x导航版本的用户,我认为您可以这样做以期望viewDidAppear出现类似行为:
import React, {useCallback } from "react";
import { useFocusEffect } from "@react-navigation/native";
const SomeComponent = () => {
useFocusEffect(
useCallback(() => {
//View did appear
}, [])
);
//Other codes
}
有关更多信息,请参见https://reactnavigation.org/docs/use-focus-effect/
答案 2 :(得分:0)
以下是使用最新的React Navigation版本模拟viewDidAppear的解决方案:
componentDidMount() {
var currentRoute = this.props.navigation.state.routeName;
this.props.navigation.addListener('didFocus', (event) => {
if (currentRoute === event.state.routeName) {
// VIEW DID APPEAR
}
});
}
感谢吴智超的想法:)
答案 3 :(得分:0)
如果您使用的是 React Navigation,请使用:
componentDidMount(){
this.props.navigation.addListener('focus', () => {
// put your code here
});
}
基本上,您是在首次安装组件时添加 focus
事件。每当(也包括第一次)组件聚焦时,它将被调用。理想情况下,您还需要通过捕获 addListener
调用返回的值并调用该返回值(实际上是取消订阅函数)来移除卸载时的侦听器。
答案 4 :(得分:-1)
我已创建了一个包含onLeftButtonPress
的自定义按钮,以按照https://github.com/facebook/react-native/issues/26处理后退运行代码
解决这个问题的方法是在左侧设置自定义后退按钮,或在iOS中实现 - viewWillDisappear:
答案 5 :(得分:-3)
您可以使用ComponentWillMount,或者如果您要离开视图,可以使用ComponentWillUnmount,它将在退出时运行一些代码。