Elements Library
一个包含 React Navigation 中使用的 UI 元素和帮助程序的组件库。如果您正在构建自己的导航器,或者想要在您的应用中重用默认功能,这将非常有用。
安装
要使用此包,请确保您已安装@react-navigation/native及其依赖项(请遵循本指南),然后安装@react-navigation/elements
- npm
- Yarn
- pnpm
npm install @react-navigation/elements
yarn add @react-navigation/elements
pnpm add @react-navigation/elements
组件
Header
一个可以用作标题的组件。默认情况下,所有导航器都使用它。
用法
import { Header } from '@react-navigation/elements';
function MyHeader() {
return <Header title="My app" />;
}
要在导航器中使用标题,您可以使用屏幕选项中的 header 选项
- 静态
- 动态
import { Header, getHeaderTitle } from '@react-navigation/elements';
const MyStack = createNativeStackNavigator({
screenOptions: {
header: ({ options, route, back }) => (
<Header
{...options}
back={back}
title={getHeaderTitle(options, route.name)}
/>
),
},
screens: {
Home: HomeScreen,
},
});
import { Header, getHeaderTitle } from '@react-navigation/elements';
const Stack = createNativeStackNavigator();
function MyStack() {
return (
<Stack.Navigator
screenOptions={{
header: ({ options, route, back }) => (
<Header
{...options}
back={back}
title={getHeaderTitle(options, route.name)}
/>
),
}}
>
<Stack.Screen name="Home" component={HomeScreen} />
</Stack.Navigator>
);
}
这不会复制堆栈和原生堆栈导航器中标题的行为,因为堆栈导航器还包括动画,而原生堆栈导航器标题由原生平台提供。
它接受以下属性
headerTitle
字符串或返回一个 React 元素的函数,供标题使用。默认为场景 title。
当指定一个函数时,它接收一个包含以下属性的对象
allowFontScaling:是否缩放以尊重文本大小辅助功能设置。tintColor:标题的文本颜色。style:Text组件的样式对象。children:标题字符串(来自options中的title)。
- 静态
- 动态
const RootStack = createNativeStackNavigator({
screens: {
Home: {
screen: HomeScreen,
options: {
headerTitle: ({ allowFontScaling, tintColor, style, children }) => (
<Text
style={[style, { color: tintColor }]}
allowFontScaling={allowFontScaling}
>
{children}
</Text>
),
},
},
},
});
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
headerTitle: ({ allowFontScaling, tintColor, style, children }) => (
<Text
style={[style, { color: tintColor }]}
allowFontScaling={allowFontScaling}
>
{children}
</Text>
),
}}
/>
headerTitleAlign
如何对齐标题。可能的值
leftcenter
在 iOS 上默认为 center,在 Android 上默认为 left。
headerTitleAllowFontScaling
标题字体是否应缩放以尊重文本大小辅助功能设置。默认为 false。
headerLeft
返回一个 React 元素以显示在标题左侧的函数。
它接收一个包含以下属性的对象
tintColor:图标和标签的颜色。pressColor:材质波纹的颜色(仅限 Android >= 5.0)。pressOpacity:按钮按下时的不透明度(Android < 5.0 和 iOS)。displayMode:元素如何显示图标和标题。在 iOS 上默认为default,在 Android 上默认为minimal。可能的值default:根据可用空间显示以下内容之一:上一个屏幕的标题、通用标题(例如“返回”)或无标题(仅图标)。generic:根据可用空间显示以下内容之一:通用标题(例如“返回”)或无标题(仅图标)。仅限 iOS >= 14,在较旧的 iOS 版本上回退到“default”。minimal:始终仅显示图标,不显示标题。
href:在 Web 上按下按钮时要打开的 URL。
您可以使用它来实现您的自定义左侧按钮,例如
- 静态
- 动态
const RootStack = createNativeStackNavigator({
screens: {
Home: {
screen: HomeScreen,
options: {
headerLeft: (props) => (
<MyButton {...props} onPress={() => {
// Do something
}}>
)
}
}
}
})
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
headerLeft: (props) => (
<MyButton
{...props}
onPress={() => {
// Do something
}}
/>
),
}}
/>
headerRight
返回一个 React 元素以显示在标题右侧的函数。
它接收一个包含以下属性的对象
tintColor:图标和标签的颜色。pressColor:材质波纹的颜色(仅限 Android >= 5.0)。pressOpacity:按钮按下时的不透明度(Android < 5.0 和 iOS)。
- 静态
- 动态
const RootStack = createNativeStackNavigator({
screens: {
Home: {
screen: HomeScreen,
options: {
headerLeft: (props) => (
<MyButton {...props} onPress={() => {
// Do something
}}>
)
}
}
}
})
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
headerLeft: (props) => (
<MyButton
{...props}
onPress={() => {
// Do something
}}
/>
),
}}
/>
headerSearchBarOptions
标题中搜索栏的选项。当指定此项时,标题将包含一个按钮以显示搜索输入。
它可以包含以下属性
ref:用于命令式操作搜索输入的 Ref。它包含以下方法focus- 聚焦搜索栏blur- 移除搜索栏的焦点setText- 将搜索栏的内容设置为给定值clearText- 移除搜索栏输入字段中存在的任何文本cancelSearch- 取消搜索并关闭搜索栏
autoCapitalize:自动大写行为。可能的值:none、words、sentences、characters。autoFocus:在挂载时自动聚焦搜索输入。cancelButtonText:用于代替默认Cancel按钮文本的文本(仅限 iOS)。inputType:输入的类型。可能的值:text、phone、number、email。onBlur:当搜索输入失去焦点时调用的回调。onChangeText:当文本更改时调用的回调。onClose:当搜索输入关闭时调用的回调。onFocus:当搜索输入获得焦点时调用的回调。placeholder:当搜索输入为空时显示的文本。
React.useLayoutEffect(() => {
navigation.setOptions({
headerSearchBarOptions: {
placeholder: 'Search',
onChangeText: (text) => {
// Do something
},
},
});
}, [navigation]);
headerShadowVisible
是否隐藏标题上的 elevation 阴影 (Android) 或底部边框 (iOS)。
这是以下样式的简写形式
{
elevation: 0,
shadowOpacity: 0,
borderBottomWidth: 0,
}
如果在 headerStyle 中指定了上述任何样式以及 headerShadowVisible: false,则 headerStyle 中的样式将优先。
headerStyle
标题的样式对象。您可以在此处指定自定义背景颜色,例如
{
backgroundColor: 'tomato',
}
请注意,如果您还使用 headerBackground,则 headerStyle 将不起作用。在这种情况下,您应该改为设置从 headerBackground 返回的元素的样式。
headerTitleStyle
标题组件的样式对象
headerLeftContainerStyle
自定义 headerLeft 组件容器的样式,例如添加内边距。
headerRightContainerStyle
自定义 headerRight 组件容器的样式,例如添加内边距。
headerTitleContainerStyle
自定义 headerTitle 组件容器的样式,例如添加内边距。
默认情况下,headerTitleContainerStyle 具有绝对定位样式,并偏移 left 和 right。如果使用了自定义的 headerLeft,这可能会导致 headerLeft 和 headerTitle 之间出现空白或重叠。可以通过调整 headerTitleContainerStyle 中的 left 和 right 样式以及 headerTitleStyle 中的 marginHorizontal 来解决此问题。
headerBackgroundContainerStyle
headerBackground 元素容器的样式对象。
headerTintColor
标题的着色颜色
headerPressColor
材质波纹的颜色(仅限 Android >= 5.0)
headerPressOpacity
标题中按钮的按下不透明度(Android < 5.0 和 iOS)
headerTransparent
默认为 false。如果为 true,则标题将没有背景,除非您使用 headerBackground 显式提供背景。标题还将浮动在屏幕上,使其与下方的内容重叠。
如果您想要渲染半透明标题或模糊背景,这将非常有用。
请注意,如果您不希望您的内容显示在标题下方,您需要手动为您的内容添加顶部边距。React Navigation 不会自动执行此操作。
要获取标题的高度,您可以将 HeaderHeightContext 与 React 的 Context API 或 useHeaderHeight 一起使用。
headerBackground
返回一个 React 元素以渲染为标题背景的函数。这对于使用图像或渐变等背景非常有用。
例如,您可以将此与 headerTransparent 一起使用以渲染模糊视图以创建半透明标题。
- 静态
- 动态
const Stack = createStackNavigator({
initialRouteName: 'Home',
screens: {
Home: {
screen: HomeScreen,
options: {
headerTransparent: true,
headerBackground: () => (
<BlurView
tint="dark"
intensity={100}
style={StyleSheet.absoluteFill}
/>
),
},
},
Profile: ProfileScreen,
},
});
import { BlurView } from 'expo-blur';
<Stack.Screen
name="Home"
component={HomeScreen}
options={{
headerTransparent: true,
headerBackground: () => (
<BlurView
tint="dark"
intensity={100}
style={StyleSheet.absoluteFill}
/>
),
}}
/>
headerStatusBarHeight
添加到标题顶部的额外内边距,以考虑半透明状态栏。默认情况下,它使用设备安全区域插槽的顶部值。传递 0 或自定义值以禁用默认行为,并自定义高度。
HeaderBackground
一个包含标题背景中使用的样式的组件,例如背景颜色和阴影。它是 headerBackground 的默认值。它接受与 View 相同的属性。
用法
<HeaderBackground style={{ backgroundColor: 'tomato' }} />
HeaderTitle
一个用于在标题中显示标题文本的组件。它是 headerTitle 的默认值。它接受与 Text 相同的属性。
标题的颜色默认为主题文本颜色。您可以通过传递 tintColor 属性来覆盖它。
用法
<HeaderTitle>Hello</HeaderTitle>
HeaderButton
一个用于在标题中显示按钮的组件。它可用于左侧和右侧按钮。它接受以下属性
onPress- 按下按钮时要调用的回调。href- 用于 Web 上锚标记的href。disabled- 控制按钮是否禁用的布尔值。accessibilityLabel- 屏幕阅读器按钮的辅助功能标签。testID- 用于在测试中定位此按钮的 ID。tintColor- 标题按钮的着色颜色。pressColor- 材质波纹的颜色(仅限 Android >= 5.0)。pressOpacity- 如果平台不支持材质波纹,则按钮按下时的不透明度。style- 按钮的样式对象。children- 为按钮渲染的内容。通常是图标。
用法
<HeaderButton
accessibilityLabel="More options"
onPress={() => console.log('button pressed')}
>
<MaterialCommunityIcons
name="dots-horizontal-circle-outline"
size={24}
color={tintColor}
/>
</HeaderButton>
HeaderBackButton
一个用于显示后退按钮标题的组件。它是堆栈导航器中 headerLeft 的默认值。它接受以下属性
disabled- 控制按钮是否禁用的布尔值。onPress- 按下按钮时要调用的回调。pressColor- 材质波纹的颜色(仅限 Android >= 5.0)。backImage- 返回一个 React 元素的函数,用于在标题的后退按钮中显示自定义图像。tintColor- 标题的着色颜色。label- 按钮的标签文本。通常是上一个屏幕的标题。默认情况下,这仅在 iOS 上显示。truncatedLabel- 当没有足够的空间容纳完整标签时显示的标签文本。displayMode:后退按钮如何显示图标和标题。在 iOS 上默认为default,在 Android 上默认为minimal。可能的值default:根据可用空间显示以下内容之一:上一个屏幕的标题、通用标题(例如“返回”)或无标题(仅图标)。generic:根据可用空间显示以下内容之一:通用标题(例如“返回”)或无标题(仅图标)。仅限 iOS >= 14,在较旧的 iOS 版本上回退到“default”。minimal:始终仅显示图标,不显示标题。
labelStyle- 标签的样式对象。allowFontScaling- 标签字体是否应缩放以尊重文本大小辅助功能设置。onLabelLayout- 当标签的大小更改时触发的回调。screenLayout- 屏幕的布局。titleLayout- 标题中标题元素的布局。canGoBack- 指示是否可以返回堆栈的布尔值。accessibilityLabel- 屏幕阅读器按钮的辅助功能标签。testID- 用于在测试中定位此按钮的 ID。style- 按钮的样式对象。
用法
<HeaderBackButton label="Hello" onPress={() => console.log('back pressed')} />
MissingIcon
一个渲染缺失图标符号的组件。它可以作为图标的后备,以显示缺少图标。它接受以下属性
color- 图标的颜色。size- 图标的大小。style- 图标的其他样式。
PlatformPressable
一个在 Pressable 之上提供抽象以处理平台差异的组件。除了 Pressable 的属性外,它还接受以下附加属性
pressColor- 按下时 Android 上材质波纹的颜色pressOpacity- 如果平台不支持材质波纹,则按下时的不透明度
Button
一个渲染按钮的组件。除了 PlatformPressable 的属性外,它还接受以下附加属性
variant- 按钮的变体。可能的值为tinted(默认)plainfilled
color- 按钮的颜色。默认为主题的主颜色。children- 在按钮内部渲染的内容。
此外,该按钮与 React Navigation 集成,并接受与 useLinkProps hook 相同的属性。
它可以通过指定屏幕名称和参数来用于在屏幕之间导航
<Button screen="Profile" params={{ userId: 'jane' }}>
Go to Profile
</Button>
或作为常规按钮
<Button onPress={() => console.log('button pressed')}>Press me</Button>
Label
Label 组件用于渲染小文本。它在底部标签导航器中用于渲染每个标签的标签。
除了标准的 Text 属性外,它还接受以下属性
tintColor- 标签的颜色。默认为主题的文本颜色。
用法
<Label>Home</Label>
ResourceSavingView
一个通过利用 removeClippedSubviews 来帮助提高非活动屏幕性能的组件。它接受一个 visible 属性来指示是否应裁剪屏幕。
用法
<ResourceSavingView visible={0}>{/* Content */}</ResourceSavingView>
实用工具
SafeAreaProviderCompat
SafeAreaProvider 组件的包装器,来自 `react-native-safe-area-context,其中包含初始值。
用法
<SafeAreaProviderCompat>{/* Your components */}</SafeAreaProviderCompat>
HeaderBackContext
React 上下文,可用于获取父屏幕的后退标题。
import { HeaderBackContext } from '@react-navigation/elements';
// ...
<HeaderBackContext.Consumer>
{(headerBack) => {
if (headerBack) {
const backTitle = headerBack.title;
/* render something */
}
/* render something */
}}
</HeaderBackContext.Consumer>;
HeaderShownContext
React 上下文,可用于检查父屏幕中是否显示标题。
import { HeaderShownContext } from '@react-navigation/elements';
// ...
<HeaderShownContext.Consumer>
{(headerShown) => {
/* render something */
}}
</HeaderShownContext.Consumer>;
HeaderHeightContext
React 上下文,可用于获取父屏幕中最近可见标题的高度。
import { HeaderHeightContext } from '@react-navigation/elements';
// ...
<HeaderHeightContext.Consumer>
{(headerHeight) => {
/* render something */
}}
</HeaderHeightContext.Consumer>;
useHeaderHeight
Hook,返回父屏幕中最近可见标题的高度。
import { useHeaderHeight } from '@react-navigation/elements';
// ...
const headerHeight = useHeaderHeight();
getDefaultHeaderHeight
Helper,返回默认标题高度。它接受以下参数
layout- 屏幕的布局,即包含height和width属性的对象。statusBarHeight- 状态栏的高度
getHeaderTitle
Helper,返回要在标题中使用的标题文本。它接受以下参数
options- 屏幕的选项对象。fallback- 如果在选项中未找到标题,则为回退标题字符串。