componentDidMount 在重定向到屏幕时不起作用

componentDidMount is not working when redirect to a screen

我有 componentDidMount 在屏幕 A 中列出一组文件(图像),从这个屏幕 A 我有另一个屏幕 B link 我可以在其中查看文件的详细视图和我可以选择删除文档。

使用

调用屏幕 A 时
  <TouchableOpacity style={Styles.HomeButton} onPress={ () => this.props.navigation.navigate('Gallery')}>
     <Text style={Styles.HomeButtonText}>View Photos</Text>
  </TouchableOpacity>

componentDidMount 工作正常,但是当我在 unlink 回调中删除文件(我正在使用 react-native-fs)时,我将导航称为

this.props.navigation.navigate('Gallery');

重定向到屏幕 A 时工作正常,但 componentDidMount 不工作,这意味着我仍然可以在列表中看到已删除的文件。 即屏幕A不刷新,请问有什么解决办法吗?

Possible reason, why your componentDidMount() is not working, is because screen B may be possible a modal.

在模态框的情况下,前一个组件不会卸载,下一个屏幕只会在它上面打开。因此,当您返回上一屏幕时,它不会再次挂载。这就是您的列表没有更新的原因。

Solution

您必须更改应该重新呈现的组件的状态。这里最好的解决方案是像 Redux 这样的状态管理库,我也在使用它。因此,当您从屏幕 B 中删除该项目时,也只需相应地更新 redux 存储。因此,使用该减速器的每个组件都会重新渲染,您还可以将一次命中保存到您的服务器。

在 react-navigation 中,如果您导航到其他屏幕,组件将不会卸载,除非您在堆栈导航中重置堆栈。所以当你回到上一个屏幕时,因为它已经安装,componentDidMount 将不会触发。

您可以绑定一个 React 导航事件侦听器,以在您返回屏幕时触发一些代码。

this.focusListner = this.props.navigation.addListener("didFocus",() => {
  // Update your data
});

卸载组件时不要忘记删除事件侦听器。

componentWillUnmount() {
    // remove event listener
    this.focusListner.remove();
}

您应该考虑在导航的 didFocus 事件中刷新您的列表。很明显,如果您使用 A -> B 的堆栈导航,并且一旦您从 B 删除文件并返回到 A,前提是 A 已经在堆栈中,因此 didMount 将在您返回时不起作用。

因此,理想情况下,您必须在删除文件时使用在 redux 中设置的某种标志在导航的 didFocus 事件中刷新列表,一旦返回 A,您就会读取标记并相应地刷新您的列表。

您可以参考 this 以更好地理解 navigation 道具和生命周期事件

您可能需要在此处查看 NavigationEvents API:https://reactnavigation.org/docs/en/navigation-events.html

要解决您的问题,您需要使用导航事件 onDidFocus 而不是 componentDidMount !

这是一种比使用命令式 API 更简单的方法,因为它负责订阅和取消订阅听众。