Reference version

ContextMenu

一个用于显示上下文菜单的 SwiftUI ContextMenu 组件。

iOS
tvOS
Included in Expo Go
Bundled version:
~56.0.6

For the complete documentation index, see llms.txt. Use this file to discover all available pages.

Expo UI ContextMenu 匹配官方 SwiftUI contextMenu API,并在长按时显示菜单。对于单击菜单交互,请改用 Menu

长按的磁贴以放大的预览形式显示,其下方带有“分享”“收藏”“删除”菜单

安装

Terminal
npx expo install @expo/ui

If you are installing this in an existing React Native app, make sure to install expo in your project.

使用

基础上下文菜单

BasicContextMenuExample.tsx
import { Host, ContextMenu, Button, Text } from '@expo/ui/swift-ui'; export default function BasicContextMenuExample() { return ( <Host matchContents> <ContextMenu> <ContextMenu.Items> <Button label="编辑" onPress={() => console.log('Edit')} /> <Button label="删除" role="destructive" onPress={() => console.log('Delete')} /> </ContextMenu.Items> <ContextMenu.Trigger> <Text>长按我</Text> </ContextMenu.Trigger> </ContextMenu> </Host> ); }

带系统图标的上下文菜单

ContextMenuWithImagesExample.tsx
import { Host, ContextMenu, Button, Text } from '@expo/ui/swift-ui'; export default function ContextMenuWithImagesExample() { return ( <Host matchContents> <ContextMenu> <ContextMenu.Items> <Button label="分享" systemImage="square.and.arrow.up" onPress={() => console.log('Share')} /> <Button label="收藏" systemImage="heart" onPress={() => console.log('Favorite')} /> <Button label="删除" systemImage="trash" role="destructive" onPress={() => console.log('Delete')} /> </ContextMenu.Items> <ContextMenu.Trigger> <Text>长按我</Text> </ContextMenu.Trigger> </ContextMenu> </Host> ); }

带预览的上下文菜单

使用 ContextMenu.Preview 可在打开菜单时在菜单上方显示自定义预览。

ContextMenuWithPreviewExample.tsx
import { View, Text as RNText } from 'react-native'; import { Host, ContextMenu, Button, Text } from '@expo/ui/swift-ui'; export default function ContextMenuWithPreviewExample() { return ( <Host matchContents> <ContextMenu> <ContextMenu.Items> <Button label="编辑" onPress={() => console.log('Edit')} /> <Button label="删除" role="destructive" onPress={() => console.log('Delete')} /> </ContextMenu.Items> <ContextMenu.Trigger> <Text>长按我</Text> </ContextMenu.Trigger> <ContextMenu.Preview> <View style={{ width: 200, height: 100, backgroundColor: '#f0f0f0', padding: 16 }}> <RNText>预览内容</RNText> </View> </ContextMenu.Preview> </ContextMenu> </Host> ); }

带选择器的上下文菜单

ContextMenuWithPickerExample.tsx
import { useState } from 'react'; import { Host, ContextMenu, Button, Text, Picker } from '@expo/ui/swift-ui'; import { pickerStyle, tag } from '@expo/ui/swift-ui/modifiers'; export default function ContextMenuWithPickerExample() { const [selectedIndex, setSelectedIndex] = useState<number | undefined>(0); return ( <Host matchContents> <ContextMenu> <ContextMenu.Items> <Button label="操作" onPress={() => console.log('Action')} /> <Picker label="大小" modifiers={[pickerStyle('menu')]} selection={selectedIndex} onSelectionChange={setSelectedIndex}> {['Small', 'Medium', 'Large'].map((option, index) => ( <Text key={index} modifiers={[tag(index)]}> {option} </Text> ))} </Picker> </ContextMenu.Items> <ContextMenu.Trigger> <Text>长按我</Text> </ContextMenu.Trigger> </ContextMenu> </Host> ); }

带分组的上下文菜单

使用 SectionDivider 组件来组织菜单项。

ContextMenuWithSectionsExample.tsx
import { Host, ContextMenu, Button, Text, Section, Divider } from '@expo/ui/swift-ui'; export default function ContextMenuWithSectionsExample() { return ( <Host matchContents> <ContextMenu> <ContextMenu.Items> <Section title="操作"> <Button label="编辑" onPress={() => console.log('Edit')} /> <Button label="复制" onPress={() => console.log('Duplicate')} /> </Section> <Divider /> <Button label="删除" role="destructive" onPress={() => console.log('Delete')} /> </ContextMenu.Items> <ContextMenu.Trigger> <Text>长按我</Text> </ContextMenu.Trigger> </ContextMenu> </Host> ); }

嵌套上下文菜单

使用嵌套的 ContextMenu 组件创建子菜单。

NestedContextMenuExample.tsx
import { Host, ContextMenu, Button, Text } from '@expo/ui/swift-ui'; export default function NestedContextMenuExample() { return ( <Host matchContents> <ContextMenu> <ContextMenu.Items> <Button label="操作" onPress={() => console.log('Action')} /> <ContextMenu> <ContextMenu.Items> <Button label="子操作 1" onPress={() => console.log('Sub 1')} /> <Button label="子操作 2" onPress={() => console.log('Sub 2')} /> </ContextMenu.Items> <ContextMenu.Trigger> <Button label="更多选项" /> </ContextMenu.Trigger> </ContextMenu> </ContextMenu.Items> <ContextMenu.Trigger> <Text>长按我</Text> </ContextMenu.Trigger> </ContextMenu> </Host> ); }

API

import { ContextMenu } from '@expo/ui/swift-ui';

Components

ContextMenu

iOS
tvOS

Type: React.Element<ContextMenuProps>

ContextMenu allows you to create a context menu, which can be used to provide additional options to the user.

Props of the ContextMenu component.

ContextMenuProps

children

iOS
tvOS
Type: ReactNode

The contents of the context menu. Should include ContextMenu.Trigger, ContextMenu.Items, and optionally ContextMenu.Preview.

Items

iOS
tvOS

Type: React.Element<{ children: ReactNode }>

Items visible inside the context menu. It could be Section, Divider, Button, Toggle, Picker or even ContextMenu itself for nested menus. Remember to use components from the @expo/ui/swift-ui library.

Preview

iOS
tvOS

Type: React.Element<{ children: ReactNode }>

The component visible above the menu when it is opened.

Trigger

iOS
tvOS

Type: React.Element<{ children: ReactNode }>

The component visible all the time that triggers the context menu when long-pressed.