Reference version

This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

弹出框

用于在浮动叠层中显示内容的 SwiftUI 弹出框组件。

iOS
Included in Expo Go
Recommended version:
~58.0.1

Expo UI Popover 与官方 SwiftUI Popover API 匹配,并提供了一种将内容显示在浮动覆盖层中的方式,该覆盖层锚定到触发元素。

浮动在触发按钮上方的弹出框浮动在触发按钮上方的弹出框

安装

Terminal
- npx expo install @expo/ui
- yarn expo install @expo/ui
- pnpm expo install @expo/ui
- bun expo install @expo/ui

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

用法

基本弹出框

BasicPopoverExample.tsx
import { useState } from 'react'; import { Host, Button, Popover, Text, VStack, } from '@expo/ui/swift-ui'; import { padding } from '@expo/ui/swift-ui/modifiers'; export default function BasicPopoverExample() { const [isPresented, setIsPresented] = useState(false); return ( <Host style={{ flex: 1 }}> <Popover isPresented={isPresented} onIsPresentedChange={isPresented => setIsPresented(isPresented) }> <Popover.Trigger> <Button label="Show Popover" onPress={() => setIsPresented(true)} /> </Popover.Trigger> <Popover.Content> <VStack modifiers={[padding({ all: 16 })]}> <Text>Hello from Popover!</Text> </VStack> </Popover.Content> </Popover> </Host> ); }

设置附着锚点

attachmentAnchor 属性控制弹出框附着到触发元素的位置。可用选项包括:center、leading、trailing、top 和 bottom。

AttachmentAnchorExample.tsx
import { useState } from 'react'; import { Host, Button, Popover, Text, VStack, } from '@expo/ui/swift-ui'; import { padding } from '@expo/ui/swift-ui/modifiers'; export default function AttachmentAnchorExample() { const [isPresented, setIsPresented] = useState(false); return ( <Host style={{ flex: 1 }}> <Popover isPresented={isPresented} onIsPresentedChange={isPresented => setIsPresented(isPresented) } attachmentAnchor="trailing"> <Popover.Trigger> <Button label="Show Popover" onPress={() => setIsPresented(true)} /> </Popover.Trigger> <Popover.Content> <VStack modifiers={[padding({ all: 16 })]}> <Text>Attached to trailing edge</Text> </VStack> </Popover.Content> </Popover> </Host> ); }

设置箭头边缘

arrowEdge 属性控制弹出框的哪一侧显示箭头。可用选项包括:none、leading、trailing、top 和 bottom。

ArrowEdgeExample.tsx
import { useState } from 'react'; import { Host, Button, Popover, Text, VStack, } from '@expo/ui/swift-ui'; import { padding } from '@expo/ui/swift-ui/modifiers'; export default function ArrowEdgeExample() { const [isPresented, setIsPresented] = useState(false); return ( <Host style={{ flex: 1 }}> <Popover isPresented={isPresented} onIsPresentedChange={isPresented => setIsPresented(isPresented) } arrowEdge="top"> <Popover.Trigger> <Button label="Show Popover" onPress={() => setIsPresented(true)} /> </Popover.Trigger> <Popover.Content> <VStack modifiers={[padding({ all: 16 })]}> <Text>Arrow on top edge</Text> </VStack> </Popover.Content> </Popover> </Host> ); }

使用 React Native 内容

你可以使用 RNHostView 在弹出框内容中嵌入 React Native 组件。

RNContentPopoverExample.tsx
import { useState } from 'react'; import { Pressable, Text as RNText, View } from 'react-native'; import { Host, Button, Popover, RNHostView, } from '@expo/ui/swift-ui'; export default function RNContentPopoverExample() { const [isPresented, setIsPresented] = useState(false); const [counter, setCounter] = useState(0); return ( <Host style={{ flex: 1 }}> <Popover isPresented={isPresented} onIsPresentedChange={isPresented => setIsPresented(isPresented) }> <Popover.Trigger> <Button label="Show RN Popover" onPress={() => setIsPresented(true)} /> </Popover.Trigger> <Popover.Content> <RNHostView matchContents> <View style={{ padding: 16 }}> <RNText style={{ fontSize: 16, fontWeight: 'bold' }}> React Native Content </RNText> <RNText style={{ color: '#666', marginVertical: 8 }}> Counter: {counter} </RNText> <Pressable style={{ backgroundColor: '#007AFF', padding: 12, borderRadius: 8, alignItems: 'center', }} onPress={() => setCounter(counter + 1)}> <RNText style={{ color: 'white' }}> Increment </RNText> </Pressable> </View> </RNHostView> </Popover.Content> </Popover> </Host> ); }

API

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

Component

Popover

iOS

Type: React.Element<PopoverViewProps>

Props

arrowEdge

iOS
Optional • Literal type: string • Default: 'none'

The edge of the attachmentAnchor that defines the location of the popover's arrow. The default is none, which results in the system allowing any arrow edge.

Acceptable values are: 'top' | 'none' | 'bottom' | 'leading' | 'trailing'

attachmentAnchor

iOS
Optional • Literal type: string

The positioning anchor that defines the attachment point of the popover.

Acceptable values are: 'center' | 'top' | 'bottom' | 'leading' | 'trailing'

children

iOS
Type: ReactNode

isPresented

iOS
Optional • Type: boolean

Whether the popover is presented.

onIsPresentedChange

iOS
Optional • Type: (isPresented: boolean) => void

A callback that is called when the isPresented state changes.