跳到主要内容

底部标签页遇上原生

·5 分钟阅读
Oskar Kwaśniewski
Oskar Kwaśniewski
Callstack

这是一篇由 react-native-bottom-tabs 的创建者 Oskar Kwaśniewski 撰写的客座文章,该库公开了与 React Navigation 集成的原生标签页原语。如果您喜欢本指南,请查看 react-native-bottom-tabs文档以获取更多信息!

这篇博客文章将解释 JavaScript 底部标签页导航器之间的差异,并提供一个逐步指南,用于将 React Navigation 与原生底部标签页导航器集成。

简介

React Navigation 开箱即用地提供了许多导航器。我们有堆栈、原生堆栈、抽屉和底部标签页,但在今天之前还没有原生底部标签页!

Android 和 iOS 都预定义了用于处理底部导航的原生组件。对于 iOS,它是 SwiftUI 的 TabView 组件,对于 Android,它是 BottomNavigationView。无论我们在哪个平台上运行,原生方法都为我们提供了适当的外观。原生底部标签页是一个包装了原生 TabViewBottomNavigationView 的导航器 - 因此您可以将它们与 React Navigation 一起使用。

让我们深入了解这个导航器的细节。

注意:原生底部标签页导航器是一个独立的包,未作为 React Navigation 的一部分发布。

概述

您可能仍然想知道 @react-navigation/bottom-tabsreact-native-bottom-tabs 之间的区别。

让我们回顾一下主要区别

  • JS 底部标签页尽可能接近地重新创建 UI,而原生底部标签页使用原生平台原语来创建标签页。这使您的标签页导航与原生应用程序没有区别,因为它们在底层使用相同的组件。
  • 原生底部标签页适应给定平台的界面,例如:tvOS 和 visionOS 将标签页显示为 iPadOS 上的侧边栏,它们出现在顶部,而 JS 底部标签页始终位于底部。

原生底部标签页的独特功能

多平台支持

原生底部标签页适应多个平台的外观。您始终获得原生外观的标签页!

Native Tabs on iOS

iOS 上的底部导航,带有原生模糊效果。

Native Tabs on Android

Android 上的底部导航,遵循 Material Design 3 样式。

Native Tabs on iPadOS

在 iPadOS 上,标签页出现在顶部,并带有一个按钮,允许您进入侧边栏模式。

Native Tabs on visionOS

在 visionOS 上,标签页出现在左侧,附加在窗口外部。

Native Tabs on tvOS

在 tvOS 上,标签页出现在顶部,使使用电视遥控器进行导航变得轻而易举。

Native Tabs on macOS

在 macOS 上,标签页出现在左侧,遵循 Finder 应用程序的设计。

自动滚动到顶部

当 ScrollView 嵌入其中时,iOS TabView 会自动滚动到顶部。

自动 PiP 避让

操作系统识别您应用程序中的导航,使画中画窗口自动避开底部导航。

平台特定样式

对于 iOS,底部导航具有内置模糊效果,使您的应用程序脱颖而出。对于 Android,您可以在 Material 2 和 Material 3 之间进行选择,并利用 Material You 系统样式。

TabView 可以在 tvOS、iPadOS 和 macOS 上转换为侧边栏。sidebarAdaptable 属性控制此行为。

开始使用

要开始使用,请按照 react-native-bottom-tabs 文档中的安装说明进行操作。

原生底部标签页导航与 JavaScript 标签页 API 尽可能相似。使您的迁移变得简单直接。

如前所述,原生底部标签页使用原生原语来创建标签页。这种方法也有一些缺点:原生组件强制执行我们需要遵循的某些约束。

API 之间存在一些值得注意的差异。最大的差异之一是原生标签页如何处理图像。在 JavaScript 标签页中,您可以将 React 组件渲染为图标,但在原生标签页中,不幸的是这是不可能的。相反,您必须提供以下选项之一

<Tab.Screen
name="Albums"
component={Albums}
options={{
tabBarIcon: () => require('person.png'),
// SVG is also supported
tabBarIcon: () => require('person.svg'),
// or
tabBarIcon: () => ({ sfSymbol: 'person' }),
// You can also pass a URL
tabBarIcon: () => ({ uri: 'https://example.com/icon.png' }),
}}
/>

因此,如果您需要完全的自定义性,例如提供自定义标签栏图标以及超出原生组件可能实现的高级样式,则应使用 JavaScript 底部标签页。

最重要的是,此库的范围不包括 Web,因此对于该平台,您应使用 JavaScript 标签页。

要开始使用,您可以从 @bottom-tabs/react-navigation 导入 createNativeBottomTabNavigator,并像使用 JavaScript 底部标签页一样使用它。

示例用法

import { createNativeBottomTabNavigator } from '@bottom-tabs/react-navigation';

const Tabs = createNativeBottomTabNavigator();

function NativeBottomTabs() {
return (
<Tabs.Navigator>
<Tabs.Screen
name="index"
options={{
title: 'Home',
tabBarIcon: () => ({ uri: 'https://example.com/icon.png' }),
}}
/>
<Tabs.Screen
name="explore"
options={{
title: 'Explore',
tabBarIcon: () => ({ uri: 'https://example.com/icon.png' }),
}}
/>
</Tabs.Navigator>
);
}
Native Tabs

您可以在此处查看该项目。

感谢阅读!

React Navigation 7.0 发布候选版

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

我们很高兴地宣布 React Navigation 7.0 的发布候选版。

此版本包含一个新的静态 API,该 API 简化了导航器的配置,并改进了 TypeScript 和深度链接支持。以及各种其他改进和新功能。

介绍静态 API

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

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

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

迈向 React Navigation 6.0

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

我们很高兴地宣布,我们终于有了 React Navigation 6 的预发布版本。我们在半年多前发布了 React Navigation 5,它通过新的动态 API 带来了许多新的可能性,并受到了压倒性的积极反响。从那时起,我们一直在努力逐步改进和完善库,并思考如何使其变得更好。这使我们进入了 React Navigation 的下一个主要版本。

React Navigation 加入 GitHub Sponsors

·4 分钟阅读
Brent Vatne
核心团队

tl;dr: 我们加入了 GitHub Sponsors,点击此处查看我们的赞助商页面并成为赞助商


React Navigation 被一些最受尊敬的工程组织、知名品牌和才华横溢的初创公司所依赖。它被金融服务应用程序使用,如 BrexCoinbase Pro;教育应用程序,如 Codecademy GoDataCamp;消费者应用程序,如 Shop from ShopifyBloombergTaskRabbitTh3rdwave;娱乐应用程序,如 国家橄榄球联盟 (NFL)(在其主应用程序和几个其他应用程序中)、CameoTracker Network for FortniteActivision Blizzard 的使命召唤配套应用程序。我个人最喜欢的使用 React Navigation 的应用程序之一是 Readwise,我喜欢用 Single Origin 2 制作咖啡,并使用 Sweepy 管理家务。

我们还看到 React Navigation 被用于帮助对抗 COVID-19 的应用程序中。我们最喜欢的是 Pinterest 联合创始人兼首席执行官 Ben Silbermann 和 Pinterest 团队与顶尖科学家合作开发的 How We Feel (文章) 以及 ZOE Global 与伦敦国王学院合作开发的 COVID Symptom Study (文章)。

Web 上的 React Navigation

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

React Native 使跨平台开发比以前容易得多,借助 React Native for Web,您还可以在 Android、iOS 和 Web 上重用代码!

为 Web 应用程序重用代码的一个主要痛点一直是导航。React Navigation 是 React Native 最广泛使用的导航库之一,但它不支持 Web。虽然您可以在 Web 上运行使用 React Navigation 的应用程序,但缺少很多东西,例如与浏览器上 URL 的正确集成。

我们终于为 React Navigation 添加了初步的 Web 支持。让我们看一下这些变化。

React Navigation 5.0 - 一种新的导航方式

·7 分钟阅读
Satyajit Sahoo
核心团队
Michał Osadnik
Michał Osadnik
核心团队

整整两年前,我们发布了 React Navigation 的第一个稳定版本。在这段时间里,该库一直在积极开发,添加了许多新功能和错误修复。React Navigation 的本质在于,它不仅要成为个人程序员使其适应其要求的项目,而且要成为一个整体社区的项目,因此强调了通用性、可扩展性以及在存在此类需求时重新考虑假设的趋势。因此,该库一直在经历增量和完全重组形状的蜕变。