React native ReactNative componentDidMount不';我没接到电话
我有两个屏幕:A和B,与StackNavigator相连 屏幕A是二维码扫描仪。一旦二维码被扫描,它就会导航到屏幕B 在屏幕B中,我使用从屏幕a作为导航参数传递的QR代码进行API调用。我在componentDidMount中触发此API调用 我的问题是:如果我从A导航到B,然后返回A,然后再导航到B,componentDidMount不会被调用,我也无法触发API调用React native ReactNative componentDidMount不';我没接到电话,react-native,react-navigation,React Native,React Navigation,我有两个屏幕:A和B,与StackNavigator相连 屏幕A是二维码扫描仪。一旦二维码被扫描,它就会导航到屏幕B 在屏幕B中,我使用从屏幕a作为导航参数传递的QR代码进行API调用。我在componentDidMount中触发此API调用 我的问题是:如果我从A导航到B,然后返回A,然后再导航到B,componentDidMount不会被调用,我也无法触发API调用 编辑: 这里有一些代码 屏幕A 扫描二维码时调用的处理函数: handleQRCode = qrCode => {
编辑: 这里有一些代码 屏幕A 扫描二维码时调用的处理函数:
handleQRCode = qrCode => {
NavigationService.navigate('Decode', {qrCode});
};
屏幕B
QR码从导航状态参数中提取,并通过redux用于API调用(startDecode)
componentDidMount() {
qrCode = this.props.navigation.state.params.qrCode;
this.props.startDecode(qrCode.data);
}
我的问题是componentDidMount只在第一次使用该路由时才被调用。这是因为B组件只在第一次被访问时才被装载,所以componentDidMount不会被再次调用 我建议您向导航器的
setOnNavigatorEvent
方法传递一个回调,并使用'didAspect'事件。您的回调将在react native navigation发出的每个事件上被调用,并且您可以验证在每次屏幕出现时执行您的逻辑(因此使用了“didAspect”事件)。您可以基于以下内容编写代码:
export default class ExampleScreen extends Component {
constructor(props) {
super(props);
this.props.navigator.setOnNavigatorEvent(this.onNavigatorEvent.bind(this));
}
onNavigatorEvent(event) {
if (event.id === 'didAppear') {
// do API call here
}
}
}
在
react导航中
每个屏幕都保持安装状态。这意味着当您返回B时,您可能已经更改了道具,但是在第一次创建此屏幕时已调用了componentDidMount
有两个选项可供您(AFAIK)处理此情况:
此.props.navigation.push将创建另一个
屏幕B,从而调用componentDidMount
React生命周期
事件
getDerivedPropsFromState
或者可以在不久的将来完成
弃用的组件将接收道具
我遇到了一个类似的问题,我使用
this.props.navigation.addListener()
来解决它。基本上,强制调用componentDidMount()可以通过再次按下同一屏幕来实现(我没有尝试过),但堆栈也会不断增长,这不是最优的。因此,当您返回到已在堆栈中的屏幕时,可以使用addListener()
查看它是否正在重新聚焦,并且可以在此处复制您的componentDidMount()
代码:
class MyClass extends Component {
someProcess = () => {
// Code common between componentDidMount() and willFocus()
}
componentDidMount() {
this.someProcess();
}
willFocus = this.props.navigation.addListener(
'willFocus',
(payload) => {
this.someProcess();
}
);
}
当第一次调用
MyClass
时,将调用componentDidMount
。对于其他时间,当它仍然在堆栈中但只是获得焦点时,addListener
将被调用 你能分享一段代码吗?@JoseVf我刚刚添加了一些代码我可能错了,但这是wix版本的react导航吗?我无法在堆栈Navigatories上调用setOnNavigatorEvent,它是。检查文档当您尝试使用它时会发生什么?“不是函数”。我用的不是wix的。通过你帖子上的“react native navigation”标签,我以为你在使用wix。我试着像这样推->这个.props.navigation.push('Decode',{qrCode}),但是componentDidMount仍然没有被调用。当我进入屏幕B时,我也不一定要更改props,但是我希望它会再次触发API调用,以刷新关于您的第一个回复的本地副本-这真的很奇怪,因为根据定义push
应该创建一个新实例,从而针对您的第二个回复调用componentDidMount
-如果您不更改道具,而只是显示已安装的屏幕B,因此不会再次调用componentDidMount