Vue NativeVue Native
Guide
Components
Composables
Navigation
Architecture
  • iOS
  • Android
  • macOS
GitHub
Guide
Components
Composables
Navigation
Architecture
  • iOS
  • Android
  • macOS
GitHub
  • Getting Started

    • Introduction
    • Installation
    • Your First App
    • Project Structure
  • Core Concepts

    • Components
    • Styling
    • Theming
    • TypeScript
    • Navigation
    • Navigation Components
    • Native Modules
    • Native Code Blocks
    • Hot Reload
  • UI Patterns

    • Forms and v-model
    • Shared Element Transitions
    • Teleport
    • Custom Native Components (escape hatch)
  • Quality & Debugging

    • Testing
    • Debugging
    • Error Handling
  • Platform Hardening

    • Security
    • Accessibility
    • Performance
  • Integration Guides

    • State Management
    • Deep Linking & Universal Links
    • State Persistence
    • Push Notifications
    • Error Reporting & Monitoring
  • Tooling

    • Managed Workflow
    • VS Code Extension
    • Neovim Plugin
  • Building & Releasing

    • Building Native Apps
    • Deployment & App Store Submission
  • Reference

    • Upgrade Guide
    • Migrating from React Native
    • Known Limitations & Platform Differences
    • Troubleshooting

Components

Vue Native provides 40 built-in components that map directly to native views on iOS, Android, and macOS.

Import

All components are globally registered — no import needed in templates.

Reading the tables

The three platform columns name the native view (or views) that backs the component on each OS.

  • "JS-composed" means the component has no native factory of its own — it is assembled in TypeScript out of other components (and, for animation, useAnimation), so it behaves identically on all three platforms.
  • "No-op" means the component is registered for API compatibility but renders nothing (or a hidden, zero-size placeholder). Your app will not crash or warn in production; it just gets no UI from that component on that platform.
  • VToolbar, VSplitView, and VOutlineView are macOS-only — in development builds they log a console warning on iOS/Android and render nothing there.

Layout

ComponentiOSAndroidmacOSDescription
<VView>UIViewFlexboxLayoutFlippedView (NSView)Container view. Supports all Flexbox props
<VScrollView>UIScrollViewScrollViewNSScrollViewScrollable container
<VSafeArea>UIView + safeAreaInsetsView + WindowInsetsCompatPass-through NSView (no insets)Respects device safe areas
<VKeyboardAvoiding>Custom VC logicAdjustResize / manual offsetPass-through NSView (no avoidance)Shifts content when keyboard appears
<VSplitView>No-opNo-opNSSplitViewResizable split pane. macOS only

Text & Input

ComponentiOSAndroidmacOSDescription
<VText>UILabelTextViewNSTextFieldText display
<VInput>UITextField / UITextViewEditTextNSTextFieldText input with v-model
<VCheckbox>Custom checkbox viewCheckBoxNSButton (checkbox)Boolean checkbox with optional label, v-model
<VRadio>UIStackView + radio circlesRadioGroup + RadioButtonNSStackView + NSButton (radio)Radio button group, v-model
<VDropdown>UIMenu (iOS 14+) / UIPickerViewSpinnerNSPopUpButtonDropdown selection, v-model
<VPicker>UIDatePickerDatePickerDialog / NumberPickerNSDatePickerDate/time and value picker

Interactive

ComponentiOSAndroidmacOSDescription
<VButton>UIButton / UIControlCustom TouchDelegateClickableView (NSView)Pressable container with :onPress
<VPressable>Custom TouchableViewCustom TouchableViewPressableView (ClickableView subclass)Generic pressable wrapper with press-in/out events
<VSwitch>UISwitchSwitchNSSwitchToggle with v-model
<VSlider>UISliderSeekBarNSSliderRange slider with v-model
<VSegmentedControl>UISegmentedControlTabLayoutNSSegmentedControlTab strip selector
<VToolbar>No-opNo-opNSToolbarWindow toolbar with items. macOS only

Media

ComponentiOSAndroidmacOSDescription
<VImage>UIImageView + URLSessionImageView + CoilNSImageViewAsync image loading with caching
<VSVG>SVGKitAndroidSVG (custom SVGView)SVGKit + NSImageViewNative SVG rendering (inline, asset, or URI)
<VVideo>AVPlayerMediaPlayerAVPlayer + AVPlayerLayerInline video playback with progress events
<VWebView>WKWebViewWebViewWKWebViewEmbedded web view

Lists

ComponentiOSAndroidmacOSDescription
<VList>UITableViewRecyclerViewNSScrollView + NSTableViewVirtualized list for large datasets. Rows come from the #item slot
<VSectionList>UITableView (sections)RecyclerViewNSScrollView + NSTableView (group rows)Sectioned list with headers
<VFlatList>JS-composed (VScrollView + VView)JS-composedJS-composedReact Native-compatible list. Takes a renderItem prop, unlike VList
<VOutlineView>No-opNo-opNSOutlineViewHierarchical outline / source list. macOS only

Feedback

ComponentiOSAndroidmacOSDescription
<VActivityIndicator>UIActivityIndicatorViewProgressBar (circular)NSProgressIndicator (spinner)Loading spinner
<VProgressBar>UIProgressViewProgressBar (horizontal)NSProgressIndicator (bar)Progress bar
<VAlertDialog>UIAlertControllerAlertDialogNSAlertNative alert
<VActionSheet>UIAlertController (.actionSheet)BottomSheetDialogNSMenuAction sheet
<VModal>UIViewController presentationDialogNSPanelFull-screen overlay modal
<VRefreshControl>UIRefreshControlSwipeRefreshLayoutNo-op placeholderPull-to-refresh. Mobile pattern — inert on macOS

Navigation

ComponentiOSAndroidmacOSDescription
<VTabBar>JS-composed (VView + VPressable)JS-composedJS-composedTab bar with labels, icons, and badges
<VDrawer>JS-composed (VPressable + VView)JS-composedJS-composedSide-menu drawer container
<VDrawerItem>JS-composedJS-composedJS-composedRow inside a VDrawer
<VDrawerSection>JS-composedJS-composedJS-composedLabelled group of VDrawerItems

System

ComponentiOSAndroidmacOSDescription
<VStatusBar>UIStatusBarStyle (via the root view controller)WindowInsetsControllerNo-opControl status bar style. Props: barStyle, hidden, animated

Vue Built-ins

These are Vue's own components, re-exported so they cooperate with the custom renderer. They have no native view of their own and work identically on all three platforms.

ComponentiOSAndroidmacOSDescription
<VTransition>JS-composed (useAnimation)JS-composedJS-composedEnter/leave transitions driven by native animations
<VTransitionGroup>JS-composed (useAnimation)JS-composedJS-composedSame, for lists
<KeepAlive>Renderer-levelRenderer-levelRenderer-levelCaches inactive component instances
<VSuspense>Renderer-levelRenderer-levelRenderer-levelAsync component boundary (Vue's Suspense)

Also registered globally

createApp() registers the 40 components above plus a few extras, so these need no import either:

Global nameNotes
ErrorBoundary / VErrorBoundaryTwo names for the same component. Both are registered and both are in the GlobalComponents type augmentation, so editors resolve either tag.
VDrawer.Item / VDrawer.SectionDotted aliases for VDrawerItem / VDrawerSection. Registered at runtime, but a dotted name cannot be a key in GlobalComponents, so it gets no editor typing. Prefer <VDrawerItem> / <VDrawerSection> in lang="ts" SFCs.

KeepAlive is deliberately absent from Vue Native's own augmentation because @vue/runtime-core already declares it — the runtime re-exports Vue's KeepAlive unchanged.

<VNavigationBar> is the one documented component that is not globally registered: it lives in @thelacanians/vue-native-navigation, so import it from that package.

Platform-only components

Three components exist for macOS window chrome and render nothing elsewhere. Guard them with usePlatform() if you share screens across targets:

<script setup>
import { usePlatform } from '@thelacanians/vue-native-runtime'

const { isMacOS } = usePlatform()
</script>

<template>
  <VToolbar v-if="isMacOS" :items="toolbarItems" @itemClick="onToolbarItem" />
  <VView v-else :style="{ flex: 1 }">
    <!-- mobile header -->
  </VView>
</template>

In development builds, mounting VToolbar, VSplitView, or VOutlineView on iOS or Android logs a console warning telling you the component renders nothing on that platform.

Edit this page
Last Updated: 10/14/26, 10:27 PM
Contributors: Abdul Hamid, Claude Opus 5.5
Next
Styling