跳到主要内容

介绍静态 API

·5 分钟阅读
Satyajit Sahoo
核心团队

使用 React Navigation 的两个主要痛点一直是 TypeScript 和深度链接配置。由于导航器的动态特性,需要手动维护 TypeScript 和深度链接配置以匹配导航结构。这可能容易出错且耗时。

为了解决这个问题,我们正在 React Navigation 7 中添加一个新的静态 API。它与 React Navigation 4 的 API 不同,但类似。许多应用程序不需要动态 API 提供的功能,它们可以使用更简单的静态 API 来简化其代码库。

注意

静态 API 是一个额外的可选 API。动态 API 不会消失,并将继续作为 React Navigation 的一流 API。事实上,静态 API 完全构建在动态 API 之上。

概述

使用动态 API,首先,我们导入一个函数,例如 createStackNavigator,然后我们使用它来定义屏幕 - 每个屏幕都有一个 name 和一个 component

const Stack = createStackNavigator();

function RootStack() {
return (
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Profile" component={Profile} />
<Stack.Screen name="Settings" component={Settings} />
</Stack.Navigator>
);
}

静态 API 遵循相同的原则。在这里,我们在一个名为 screens 的属性中指定屏幕,屏幕的名称是配置对象中的键,值包含要渲染的组件

const RootStack = createStackNavigator({
screens: {
Home: {
screen: Home,
},
Profile: {
screen: Profile,
},
Settings: {
screen: Settings,
},
},
});

然后在编写导航配置后,我们调用 createStaticNavigation 并渲染返回的组件

const Navigation = createStaticNavigation(RootStack);

function App() {
return <Navigation />;
}

此组件类似于 NavigationContainer,并接受 NavigationContainer 接受的大多数 props。因此,您可以在此处执行诸如跟踪屏幕更改、持久化导航状态等操作。

请参阅 静态 API 参考 以了解更多详情。

TypeScript

typescript 类型可以从带有 StaticParamList 类型的根导航器中推断出来,然后它们将在您使用 useNavigation 的任何地方可用。

我们唯一需要添加的额外代码是 RootParamList 接口的代码

declare global {
namespace ReactNavigation {
interface RootParamList extends StaticParamList<typeof RootStack> {}
}
}

请参阅 使用 TypeScript 进行类型检查 以了解更多详情。

深度链接

深度链接 API 有 2 项改进

  1. 链接配置现在是导航配置的一部分,可以在屏幕旁边指定。这使得保持链接配置与导航结构同步更容易。

    const RootStack = createStackNavigator({
    screens: {
    Profile: {
    screen: ProfileScreen,
    linking: {
    path: 'user/:id',
    },
    },
    Settings: {
    screen: SettingsScreen,
    linking: {
    path: 'settings',
    },
    },
    },
    });
  2. 通过指定 enabled: 'auto',路径可以从屏幕名称自动生成。这避免了为每个屏幕手动指定路径的需要。

    const RootStack = createStackNavigator({
    screens: {
    // Generated path: ''
    Home: {
    screen: HomeScreen,
    },
    // Generated path: 'profile'
    Profile: {
    screen: ProfileScreen,
    },
    // Generated path: 'news-feed'
    NewsFeed: {
    screen: NewsFeedScreen,
    },
    },
    });

    const Navigation = createStaticNavigation(RootStack);

    function App() {
    return (
    <Navigation
    linking={{
    prefixes: ['https://mychat.com', 'mychat://'],
    enabled: 'auto',
    }}
    >
    <Navigation />
    </Navigation>
    );
    }

请参阅 配置链接 以了解更多详情。

身份验证流程

动态 API 的优点之一是声明式身份验证流程。您可以声明式地定义哪些屏幕可供已登录和访客用户使用,React Navigation 将自动处理显示适当的屏幕。为了保持类似的体验,我们在新的静态 API 中使用 if 属性添加了一些动态性

const RootStack = createNativeStackNavigator({
screens: {
Home: {
if: useIsSignedIn,
screen: HomeScreen,
},
SignIn: {
if: useIsSignedOut,
screen: SignInScreen,
},
},
});

if 属性接受一个返回布尔值的 Hook。当 Hook 返回 true 时,屏幕将包含在导航树中,当它返回 false 时,它将不会被包含。

请参阅 身份验证流程 以了解更多详情。

互操作性

由于我们在同一个库中有 2 个不同的 API,因此它们协同工作非常重要。这样,您可以使用静态 API 启动一个应用程序,但是如果您需要特定导航器的灵活性,则可以为该部分使用动态 API。或者您可能希望迁移到静态 API 以降低复杂性,并且通过互操作性,您可以逐步完成迁移。

请参阅 结合静态和动态 API 以了解更多详情。

帮助我们测试

静态 API 目前在 React Navigation 7 alpha 中可用。您可以通过安装 React Navigation 包的 next 标签来试用它

yarn add @react-navigation/native@next @react-navigation/native-stack@next

除了静态 API 之外,React Navigation 7 还包括许多其他改进和新功能。请务必查看升级指南以了解所有更改。

我们很乐意获得社区关于它如何为您工作的反馈,并在稳定版本发布之前发现任何问题。如果您有任何反馈或建议,请在我们的 GitHub Discussions 论坛上告知我们。如果您发现任何问题,请在我们的 GitHub issues 上报告它们。