当我从其他屏幕导航到初始路线时,为什么componentDidMount不执行?

时间:2019-06-01 18:10:46

标签: javascript react-native navigation react-native-android android-lifecycle

我正在为我的移动应用程序使用react-navigation,我有2条路线-Home和Favoriti,其中Home是初始路线。这两个组件都具有componentDidMount。每当我从Home导航到Favoriti时,都会安装Favoriti组件,但是当我导航回Home时,其componentDidMount不会执行。它只会在我第一次打开该应用程序时执行,但是每次导航到该应用程序时都需要安装它。

 public partial class WinControl : UserControl
    {
        public WinControl()
        {
            InitializeComponent();
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }

没有错误显示,只是我每次导航到原始路线时,都不执行初始路线的componentDidMount,但是其他路线却会执行。

2 个答案:

答案 0 :(得分:2)

“ componentDidMount”不会再次运行,因为已经创建了“ Home”组件,并且只要它在堆栈中就将继续存在。 Home组件的该实例将被重用,并且当用户返回该Home组件时,用户将继续从中断处继续。要再次运行componentDidMount,您需要启动Home组件的新实例。

代替使用后退按钮。创建一个按钮,然后在onPress属性中使用push方法导航到Home的新实例。

<Button
  title="Home"
  onPress={() => this.props.navigation.push('Home')}
/>

https://reactnavigation.org/docs/en/navigating.html#going-back

编辑:

这将使您的应用暂时运行; sfratini很好地指出了这一点,如果您最终在公司/客户中工作或发布自己的应用,他的答案将对您更好。出于他所说的所有原因,添加一个侦听器将是理想的选择。

答案 1 :(得分:1)

雷蒙德的答案应该起作用,并且解释是相同的。 ComponentDidMount仅运行一次,并且您无需在堆栈中再次运行。

我建议您在componentWillReceiveProps上添加一个侦听器,当再次加载主屏幕时,该监听器也会触发,您可以查看是否需要刷新或重新加载屏幕。

但是,当然,这取决于您的用例。如果您继续将主屏幕推到堆栈上,唯一的减小是,一旦用户到达主屏幕,通常后退按钮应表示“离开应用程序”,如果将其推到堆栈上并按回去,您只会返回一个屏幕。确实是糟糕的UX,但是如果taht为您效劳,那就好。