React Native:如何正确输入嵌套导航器?

2024-02-25

情况:

正如您可能知道的那样,我目前正在构建一个有声读物播放器(多么有创意)。这是我第一个针对反应原生和打字稿的更大项目,在正确输入导航方面我有点挣扎。首先:这是一个快速概述:

疑问/问题:

  1. 感觉我使用了太多嵌套导航器,但由于我没有任何经验,所以很难判断。你怎么认为?如果我使用太多,我应该如何重组? (这docu https://reactnavigation.org/docs/group/提到了团体,但我不知道如何在这里实现)
  2. 如何正确键入我的组件?到目前为止我的做法如下(LibraryStack 自下而上的视角):
// 1. I created a type for the Screen routes (including the passed down props)
type LibraryRoutes = {
  Library: undefined;
  BookDetails: { album: Album };
  BookSettings: { album: Album };
};

// 2. A type for the different Routes (using NavigatorScreenParams, but I'm not sure I use them correctly)
// This then goes up the same way up to the root
type TabRoutes = {
  HomeStack: NavigatorScreenParams<HomeRoutes>;
  LibraryStack: NavigatorScreenParams<LibraryRoutes>;
  ...etc.
};

// 3. Then I created interfaces for the props
interface TabNavProps<RouteName extends keyof TabRoutes> {
  navigation: BottomTabNavigationProp<TabRoutes, RouteName>;
  route: RouteProp<TabRoutes, RouteName>;
}

这就是我的挣扎真正开始的地方,因为当我尝试在不同堆栈之间导航时,我不断遇到错误。我试图通过实现 CompositeScreenProps 来解决这个问题,但我仍然总是遇到类型错误和导航死胡同。

// Example for a CompositeScreenProp:
type LibraryProps = CompositeScreenProps<
  StackScreenProps<LibraryRoutes, "BookSettings">,
  CompositeScreenProps<
    StackScreenProps<AudioRoutes, "AudioPlayer">,
    BottomTabScreenProps<TabRoutes>
  >
>;

你能帮我把这些部件组装在一起吗?我多次观看视频和阅读文档,但感觉就像我只是复制而没有真正理解,并且总是以错误结束。

  1. 我的最后一个问题是一个更高层次的问题:我实际上应该将这些不同的 prop 文件放在哪里?在使用它的组件中创建它们是更好的做法,还是应该构建一个仅包含与导航相关的所有类型/接口的集中文件?

不管怎样,感谢您阅读这篇超长的文字。我认为如果我展示我正在努力解决的实际例子可能会有所帮助,所以我希望它能做到:)


新结构 https://i.stack.imgur.com/o3ksc.png

您应该仅在屏幕上需要的地方使用底部导航。在其他情况下,将堆栈放入全局堆栈中。它将隐藏底部导航,并让您可以从应用程序中的任何位置访问屏幕(当然如果您需要)。

import React from 'react';

import {BottomTabScreenProps} from '@react-navigation/bottom-tabs'
import {CompositeScreenProps} from '@react-navigation/native'
import {StackScreenProps} from '@react-navigation/stack';



type IAuthStack = {
  SignIn: undefined;
  SignUp: undefined;
  ForgetPassword: undefined;
}

type IRootStack = {
  MainBottomTabs: IMainBottomTabs;
  BookDetailScreen: {
    //or you can put your book information
    bookId: string;
  };
  BookSettingsScreen: {
    //or you can put your book information
    bookId: string;
  };
  ProfileSettginsScreen: {
    //or you can put your profile information
    profileId: string;
  };
}

type IMainBottomTabs = {
  Home: undefined;
  Library: undefined;
  Search: undefined;
  Profile: undefined;
}

//Local access to stack
type HomeScreenProps = BottomTabScreenProps<IMainBottomTabs, 'Home'>;
//Access with parent stack
type ProfileScreenProps = CompositeScreenProps<BottomTabScreenProps<IMainBottomTabs, 'Profile'>, StackScreenProps<IRootStack>>;

const HomeScreen:React.FC<HomeScreenProps> = ({navigation}) => {
  const handlePressNavigate = () => navigation.navigate('Library')
  return <></>
}

const ProfileScreen:React.FC<ProfileScreenProps> = ({navigation}) => {
  const handlePressNavigate = () => navigation.navigate('ProfileSettginsScreen')
  return <></>
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Native:如何正确输入嵌套导航器? 的相关文章

随机推荐

  • ng-bootstrap ngbDropdown 不起作用 Angular 4

    ng 下拉菜单不起作用 注 我遵循了答案here https stackoverflow com questions 43111633 ng bootstrap ngbdropdown not working in angular 4并将
  • Livereload 在 gulp 中不起作用

    我使用了 gulp webapp 来自 yeoman 的生成器 并添加了一些其他任务 如 gulp sass 和 gulp coffee 但现在 Livereload 没有启动 我需要看到这样的东西 gulp Live reload ser
  • 如何正确捕获 Aero/DWM 上的特定窗口

    背景资料 我编写了这个 MFC 应用程序并使用了很长时间 当用户按下 Print Screen Alt Print Screen 键时 它几乎会自动将屏幕截图保存到硬盘 我一直推迟使用任何与 Aero 相关的东西 直到现在我已经使用 Win
  • Django 缩进错误

    我是 Django 新手 正在教程中尝试这段代码 但现在我无法运行我的程序 因为出现以下错误 IndentationError at unexpected indent D django workspace django bookmarks
  • geb.driver.DriverCreationException:无法从回调创建驱动程序

    我正在设置一些 Geb 测试 但收到 geb driver DriverCreationException 无法从回调创建驱动程序 错误 Geb 将尝试启动测试浏览器窗口 但一旦启动 我的任何测试都不会运行 并且出现上述错误 我刚刚将 Fi
  • Volley JsonObjectRequest Post 请求不起作用

    我正在使用 android Volley 来发出请求 所以我使用这段代码 我不明白一件事 我检查我的服务器 参数始终为空 我认为 getParams 不起作用 我应该怎么做才能解决这个问题 RequestQueue queue MyVoll
  • 单击图像时选择单选按钮

    我想在单击他的图像时选择单选按钮 但它不起作用 这是我尝试过的 ul class options list li a class mydata href img class small image preview src value id
  • 如何将自定义类保存/序列化到设置文件?

    我有一个小类 包含两个字符串 如下所示 public class ReportType private string displayName public string DisplayName get return displayName
  • 如何组合目标文件(.o)来创建iOS静态库(.a)?

    我已经编译了一个库并且有目标文件 o 现在我想使用 ar 将它们组合到静态库中 我可以做到这一点 但是当我在 iOS 项目中添加该文件时 它说该库是存档类型 而链接架构是arm7 我该如何解决这个问题 Solved ar crs libst
  • 在 Eclipse 中以编程方式调整视图大小

    我正在测试一个non e4使用 SWTBot 的 RCP 应用程序 我需要更改视图的大小 移动窗框 我尝试失败 使用 SWTBot 调整我的视图大小 没有这样的 api 使用 Eclipse 3 API 调整我的视图大小 不支持 使用底层
  • Mongomapper 数组的多对多问题

    我想从用户的任务列表中列出用户的所有任务名称 但是当我使用下面的代码时 我收到以下消息 undefined method task id for 这是我的课程 class User include MongoMapper Document
  • 共享表 - 排除未作为 UIActivityType 中的类型属性提供的选项

    我想排除Add to iCloud Drive Add to Reading List Save to Files Print来自共享表 我可以使用以下代码排除 添加到阅读列表 和 打印 选项 因为这些类型属性 https develope
  • 如何实现论坛权限

    我已经开始在 MVC 框架上用 PHP 开发论坛应用程序 并且已经到了向成员分配权限的阶段 例如 读取 写入 更新 删除 现在 我知道我可以在数据库的用户表下添加 5 列并将它们设置为 1 0 但如果我想添加其他规则 例如 MOVE 这对我
  • 如何使 tkinter 窗口在 i3 windowmanager 中浮动

    我只是在 python 中玩了一下 tkinter 但是我的 i3 平铺 窗口管理器遇到了一些 麻烦 我想创建一个浮动窗口来输入值 类似于 打开文件 对话框 这一定是可能的 因为 Gimp 也可以在 i3 中使用浮动窗口 当然 我不确定 t
  • Java 中的内联比较器与自定义比较器

    对列表进行排序时 使用内联 java Comparator 带有匿名内部类 与实现单独的自定义 Comparator 类之间是否存在性能差异 1 public class SortByErrorComparator implements C
  • 如何在同一浏览器实例中运行多个测试方法而不关闭它(C#、Selenium WebDriver NUnit)?

    我是 c 和 Selenium 的初学者 我想知道是否可以在同一浏览器实例中运行多个 TestMethod s 而无需关闭它 例如 Can Change Name And Title 完成后 我想继续 Can Change Profile
  • 如何从命令行将每两行合并为一行?

    我有一个具有以下格式的文本文件 第一行是 KEY 第二行是 VALUE KEY 4048 1736 string 3 KEY 0 1772 string 1 KEY 4192 1349 string 1 KEY 7329 2407 stri
  • 调整画布图像大小

    我正在尝试上传图像并将它们放入不同大小的盒子中 为了让您了解该应用程序的功能 人们上传图像并将它们打印到海报上 例如 我们的海报尺寸为 8 x 10 活动区域 完整尺寸为 9 5 x 11 5 由于最小 DPI 为 100 我们通常将 8x
  • MTKView - 调整纹理大小以填充视图

    我对 Metal 很陌生 但正在努力遵循 Apple 的规定AVCam滤镜 https developer apple com documentation avfoundation cameras and media capture avc
  • React Native:如何正确输入嵌套导航器?

    情况 正如您可能知道的那样 我目前正在构建一个有声读物播放器 多么有创意 这是我第一个针对反应原生和打字稿的更大项目 在正确输入导航方面我有点挣扎 首先 这是一个快速概述 疑问 问题 感觉我使用了太多嵌套导航器 但由于我没有任何经验 所以很