如何在每次更改路线时调用“ componentDidMount”或等效名称?

时间:2019-04-13 16:27:50

标签: javascript react-native navigation

此刻,我每次尝试打一条新路线时都试图致电componentDidMount。但是当我更改路线然后返回到原始组件时,它不会再次调用cdm

有什么办法吗?

可以在必要时发布代码,但是我只想知道如何在每次路线更改时调用某个内容,就像我过去使用componentDidMount

这是用于反应本机navigation的方式,据我所知,这种方式可以在正常的React中使用

2 个答案:

答案 0 :(得分:0)

您可以订阅反应导航的焦点事件,并在导航到相关路线时做任何需要做的事情。

如何订阅的文档可以在react导航api参考中找到

答案 1 :(得分:0)

我最近有一个类似的问题。就我而言,我认为问题主要与使用React Native的堆栈导航安装组件有关。仅当您在堆栈上时,componentDidMount才会被调用一次,并且直到您离开堆栈并返回到堆栈时才重新渲染。我将解决问题的方法放在下面:

 /** 
  * @issue page does not refresh if its already been mounted on the navigation stack
  * @todo  listen to navigation events, and trigger refresh
  * @todo  get rid of componentDidMount, and instead 
  *        have the navigation event handler trigger the refresh

因此,基本上,当您导航到给定页面时,不要使用componenDidMount(),而是传递某种类型的导航参数,使该页面知道需要更新。

navigate('ExamplePage', { example: '<new Example>' })}

ExamplePage

componentWillReceiveProps(nextProps) {
  if (nextProps.navigation.state.params.example) {
    this.props.retrieveData(this.props.example);
  }
}

编辑/更新 在我看来,作为另一个选择和更好的解决方案,您可以收听NavigationEvents。这是文档,尽管没有很深入 https://reactnavigation.org/docs/en/navigation-events.html

因此,在我的情况下,我仍然会听从上一屏幕上的navigate传入的导航参数。然后,通过在下面添加此代码,将刷新功能添加到onDidFocus,每次页面出现在屏幕上时都会触发该刷新功能。

import {NavigationEvents} from 'react-navigation';

   render() {
     return (
       ...
       <NavigationEvents onDidFocus={() => this._refresh()} />
       ...
     )
   }

使用此解决方案,您仍然可以在开始时仍然呼叫componentDidMount()。而且您不必使用componentWillReceiveProps,因为这是一个不好的习惯