深度链接到具有不同参数的已打开屏幕。是否可以?

Kri*_*ero 4 deep-linking react-native react-navigation

我正在开发一个应用程序,它有一个类别屏幕,其中显示该类别的相关帖子。我正在使用反应导航在屏幕之间导航并处理深层链接。类别屏幕可以在应用程序内或通过深层链接访问。要通过深层链接访问类别屏幕,我正在使用类似myapp://category/:id.

如果应用程序已打开并且专注于类别屏幕,则深层链接不会执行任何操作。

我目前已经使用componentDidUpdate生命周期方法“修复”了它,以比较存储在状态中的 ID 和navigation.getParam.

componentDidUpdate = () => {
  const { navigation } = this.props;
  const { categoryID } = this.state;
  const paramID = navigation.getParam('id', null);

  if (paramID !== categoryID) {
    this.setState({ categoryID: paramID }, () => {
      // fetch data
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说似乎是一个肮脏的修复。有更好的方法吗?也许使用推送打开所有深层链接而不是通过反应导航进行导航?

Kap*_*jza 8

对于像我这样来到这里想知道如何做到这一点的人,这里是解决方案:

您可以使用该getId Stack.Screen财产。您只需从属性返回唯一的 ID 即可getId。这是一个例子:

假设我们有一个UserScreen组件,它是导航器的一部分Stack。有UserScreen一个路由参数:userId。我们可以像这样使用getId该属性:

import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

const AppStack = () => {
  const getUserRouteId = ({ params }) => {
    return params && params.userId;
  };

  return (
    <Stack.Navigator>
      {/* Other routes */}
      <Stack.Screen name="User" component={UserScreen} getId={getUserRouteId} />
    </Stack.Navigator>;
  );
};
Run Code Online (Sandbox Code Playgroud)

现在,当您尝试使用该功能正常导航到此路线时navigate,如果导航操作中的参数与您当前所在的userId参数不同,它会将您导航到新的用户屏幕。React Navigation 深度链接在内部使用该函数。UserScreennavigate