LazyVStack
A SwiftUI LazyVStack component for lazy vertical layouts.
Expo UI LazyVStack matches the official SwiftUI LazyVStack API and arranges its children vertically, creating items only as needed (when they become visible during scrolling).
LazyVStackis not truly lazy yet: the native side only builds visible items, but React still creates every child up front, so large lists can be slow to mount. We are working on improving this. For large lists, we recommend FlashList or Legend List.
Usage
Basic lazy vertical stack
LazyVStack should be used inside a ScrollView to enable lazy rendering.
import {
Host,
ScrollView,
LazyVStack,
Text,
} from '@expo/ui/swift-ui';
export default function BasicLazyVStackExample() {
return (
<Host style={{ flex: 1 }}>
<ScrollView>
<LazyVStack spacing={12}>
{Array.from({ length: 100 }, (_, i) => (
<Text key={i}>{`Item ${i}`}</Text>
))}
</LazyVStack>
</ScrollView>
</Host>
);
}With alignment
The alignment prop controls horizontal alignment of children. Available options are: leading, center, and trailing.
import {
Host,
ScrollView,
LazyVStack,
Rectangle,
} from '@expo/ui/swift-ui';
import { frame } from '@expo/ui/swift-ui/modifiers';
export default function LazyVStackAlignmentExample() {
return (
<Host
matchContents={{ vertical: true }}
style={{ width: '100%' }}>
<ScrollView>
<LazyVStack spacing={12} alignment="leading">
<Rectangle
modifiers={[frame({ width: 50, height: 50 })]}
/>
<Rectangle
modifiers={[frame({ width: 100, height: 50 })]}
/>
<Rectangle
modifiers={[frame({ width: 75, height: 50 })]}
/>
</LazyVStack>
</ScrollView>
</Host>
);
}API
import { LazyVStack } from '@expo/ui/swift-ui';Component
LazyVStack
Type: React.Element<LazyVStackProps>
LazyVStackProps
alignment
Optional • Literal type: string
The horizontal alignment of children within the stack.
Acceptable values are: 'center' | 'leading' | 'trailing'
children
Type: ReactNode
spacing
Optional • Type: number
The spacing between children.
Inherited props
Modifiers
Use these modifiers in the modifiers prop of the SwiftUI version.
Modifiers for LazyVStack
scrollTargetLayoutiOS 17+
Modifiers for any view
accessibilityAddTraitsaccessibilityElementaccessibilityHiddenaccessibilityHintaccessibilityIdentifieraccessibilityInputLabelsaccessibilityLabelaccessibilityRemoveTraitsaccessibilityValueactivityBackgroundTintalignmentGuideallowsTighteninganimationaspectRatiobackgroundbackgroundOverlayblurboldborderbrightnessclippedclipShapecolorInvertcontainerBackgroundcontainerRelativeFrameiOS 17+containerShapecontentShapecontentTransitioniOS 16+contrastcornerRadiuscreateModifierdisableddynamicTypeSizeenvironmentfixedSizefontforegroundColorforegroundStyleframegeometryGroupiOS 17+glassEffectglassEffectIdgrayscalegridCellAnchoriOS 16+gridCellColumnsgridCellUnsizedAxesgridColumnAlignmentiOS 16+hiddenhueRotationidignoreSafeAreaimageScaleinvalidatableContentiOS 17+italickerninglayoutPrioritylineHeightiOS 26+lineLimitlineSpacingluminanceToAlphamaskmatchedGeometryEffectminimumScaleFactormonospacedDigitmultilineTextAlignmentoffsetonAppearonDisappearonGeometryChangeonLongPressGestureonTapGestureopacityoverlaypaddingprivacySensitiveredactedrotation3DEffectrotationEffectsaturationscaleEffectshadowstrikethroughstrokeBordertextCasetinttruncationModeunderlineunredactedwidgetURLzIndex
Sources
The original Expo docs for this page:
- LazyVStack (SwiftUI) (
source-of-truth/versions/v57.0.0/sdk/ui/swift-ui/lazyvstack.md)