# Expo Router in React Native: Complete Handleiding voor Bestandsgebaseerde Navigatie > Uitgebreide handleiding over Expo Router voor React Native: bestandsgebaseerde navigatie, dynamische routes, tabnavigatie, modale schermen, getypeerde routes en routebeveiliging met praktische codevoorbeelden. - Published: 2026-04-18 - Updated: 2026-04-18 - Author: SharpSkill - Tags: react-native, expo, expo-router, navigation, mobile-development, tutorial - Reading time: 9 min --- Expo Router heeft de navigatie in React Native-applicaties ingrijpend vereenvoudigd door bestandsgebaseerde routering te introduceren in het mobiele ecosysteem. Waar ontwikkelaars voorheen navigatiestacks handmatig moesten definiëren met complexe configuratieobjecten, volstaat het nu om bestanden aan te maken in de map `app/`. De mappenstructuur bepaalt automatisch de volledige navigatiehiërarchie van de applicatie. Dit principe, dat webframeworks zoals Next.js populair hebben gemaakt, biedt een consistente ontwikkelervaring voor iOS, Android en het web vanuit één enkele codebase. Met Expo SDK 55 en de nieuwste versie van Expo Router is bestandsgebaseerde navigatie de standaard geworden voor nieuwe Expo-projecten. > **Snel aan de slag** > > Nieuwe Expo-projecten worden standaard met Expo Router geleverd. Met het commando `npx create-expo-app@latest --template default@sdk-55` wordt een volledig geconfigureerd project gegenereerd met bestandsgebaseerde routering. Voor bestaande projecten volstaat het om het `expo-router`-pakket te installeren en het ingangspunt van de applicatie aan te passen. ## Het principe van bestandsgebaseerde routering Het kernidee achter Expo Router is rechtlijnig: elk bestand in de map `app/` wordt automatisch een route in de applicatie. Er is geen centraal configuratiebestand nodig om routes te registreren. Een bestand op het pad `app/settings.tsx` resulteert in de route `/settings`, terwijl `app/profile/edit.tsx` overeenkomt met `/profile/edit`. Ten opzichte van de traditionele configuratie met React Navigation levert deze aanpak drie wezenlijke voordelen op: - **Geen configuratie vereist**: routes ontstaan automatisch zodra het bestand wordt aangemaakt - **Automatische deep linking**: elk scherm beschikt over een unieke URL, wat delen en testen aanzienlijk vergemakkelijkt - **Getypeerde navigatie**: TypeScript kent de beschikbare routes al tijdens de compilatiefase Het bestand `index.tsx` in de hoofdmap van `app/` fungeert als startscherm van de applicatie: ```typescript // app/index.tsx import { View, Text, StyleSheet } from 'react-native' import { Link } from 'expo-router' export default function HomeScreen() { return ( Welcome {/* Link maps directly to file path */} Open Settings Edit Profile ) } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', padding: 24 }, title: { fontSize: 28, fontWeight: 'bold', marginBottom: 16 }, link: { fontSize: 16, color: '#61DAFB', marginTop: 12 }, }) ``` Het `Link`-component werkt op alle platformen. Op het web genereert het een standaard ankertag met correcte `href`-attributen, wat gunstig is voor zoekmachineoptimalisatie. Op iOS en Android activeert het een native stack-navigatie met de bijbehorende animaties en gebaren. ## Projectstructuur en layoutbestanden De organisatie van bestanden en mappen in een Expo Router-project volgt vaste conventies. Mappen representeren routesegmenten en `_layout.tsx`-bestanden bepalen hoe de onderliggende schermen worden weergegeven. Het root-layoutbestand fungeert als de primaire navigator en vervangt het traditionele `App.tsx` als ingangspunt. Een representatieve projectstructuur ziet er als volgt uit: ```text app/ _layout.tsx # Root layout (Stack or custom) index.tsx # Home screen (/) (tabs)/ # Tab group (parentheses = route group) _layout.tsx # Tab navigator home.tsx # /home tab search.tsx # /search tab profile.tsx # /profile tab settings/ _layout.tsx # Settings stack layout index.tsx # /settings notifications.tsx # /settings/notifications privacy.tsx # /settings/privacy ``` Routegroepen -- mappen waarvan de naam tussen haakjes staat -- maken het mogelijk bestanden te organiseren zonder de URL-structuur te beïnvloeden. De map `(tabs)` in het voorbeeld hierboven creëert een tabnavigator, maar de URL's blijven `/home`, `/search` en `/profile` in plaats van `/tabs/home`. Het root-layoutbestand definieert het navigatietype en de globale schermopties: ```typescript // app/_layout.tsx import { Stack } from 'expo-router' export default function RootLayout() { return ( ) } ``` Naast het definiëren van de navigatiestructuur dient de root layout ook als initialisatiepunt voor providers, het laden van lettertypen en andere globale configuratie die de gehele applicatie omvat. ## Tabnavigatie configureren Tabnavigatie vormt het meest gangbare navigatiepatroon in mobiele applicaties. In Expo Router wordt tabnavigatie geïmplementeerd door een `_layout.tsx`-bestand aan te maken binnen een routegroep en daarin het `Tabs`-component te gebruiken: ```typescript // app/(tabs)/_layout.tsx import { Tabs } from 'expo-router' import { Ionicons } from '@expo/vector-icons' export default function TabLayout() { return ( ( ), }} /> ( ), }} /> ( ), }} /> ) } ``` Elke `Tabs.Screen` correspondeert met een bestand binnen de routegroep `(tabs)/`. De eigenschap `name` moet exact overeenkomen met de bestandsnaam zonder extensie. Expo Router behandelt iedere tab als een onafhankelijke navigatiestack, waardoor gebruikers binnen een tab naar subschermen kunnen navigeren zonder de status van andere tabs te verliezen. ## Dynamische routes en routeparameters Dynamische routes stellen ontwikkelaars in staat schermen te bouwen die reageren op variabele URL-segmenten. Door een bestandsnaam tussen vierkante haken te plaatsen, wordt een dynamisch routesegment aangemaakt. Het bestand `[id].tsx` vangt een enkel segment op, terwijl `[...slug].tsx` alle resterende segmenten vastlegt. ```typescript // app/product/[id].tsx import { View, Text, StyleSheet } from 'react-native' import { useLocalSearchParams, Stack } from 'expo-router' export default function ProductScreen() { const { id } = useLocalSearchParams<{ id: string }>() return ( Product Details ID: {id} ) } const styles = StyleSheet.create({ container: { flex: 1, padding: 24 }, heading: { fontSize: 24, fontWeight: 'bold', marginBottom: 8 }, id: { fontSize: 16, color: '#888' }, }) ``` Bij het navigeren naar `/product/42` wordt dit scherm weergegeven met `id` ingesteld op `"42"`. De hook `useLocalSearchParams` biedt getypeerde toegang tot alle routeparameters en is lokaal aan het component, zodat elk scherm zijn eigen parameterwaarden behoudt in complexe navigatiescenario's. Voor het opvangen van meervoudige URL-segmenten biedt Expo Router catch-all routes: ```typescript // app/docs/[...slug].tsx import { useLocalSearchParams } from 'expo-router' export default function DocsScreen() { const { slug } = useLocalSearchParams<{ slug: string[] }>() return } ``` De route `[...slug].tsx` vangt een willekeurig aantal padsegmenten op na `/docs/` en retourneert deze als een array van strings. Dit patroon is bijzonder geschikt voor documentatiesystemen, blogs of andere structuren met een hiërarchie van variabele diepte. ## Getypeerde routes voor compileertijdbeveiliging Een van de krachtigste functies van Expo Router is de ondersteuning voor getypeerde routes. Wanneer deze functionaliteit is ingeschakeld, genereert Expo Router automatisch TypeScript-types voor alle routes in de applicatie. Hierdoor worden typefouten in URL's en ontbrekende routes al tijdens de compilatie opgespoord, nog voordat de applicatie wordt uitgevoerd. De configuratie vindt plaats in het bestand `app.json`: ```json { "expo": { "experiments": { "typedRoutes": true } } } ``` Na activering accepteren het `Link`-component en de methode `router.push()` uitsluitend routes die daadwerkelijk bestaan in het project: ```typescript // app/checkout.tsx import { router } from 'expo-router' function handleCheckout(cartId: string) { router.push(`/product/${cartId}`) } ``` In omvangrijke projecten met tientallen schermen en honderden navigatiekoppelingen is deze typeveiligheid van onschatbare waarde. TypeScript markeert ongeldige routes direct in de code-editor, waardoor fouten die anders pas tijdens het testen of in productie zouden optreden, vroegtijdig worden ondervangen. De gegenereerde types waarborgen bovendien de consistentie tussen parameternamen in de routedefinitie en het ontvangende component. ## Modale schermen implementeren Modals zijn schermen die over de bestaande inhoud heen worden weergegeven en worden doorgaans ingezet voor formulieren, bevestigingen of snelle detailweergaven. In Expo Router worden modale schermen geconfigureerd via de eigenschap `presentation: 'modal'` in de layout: ```typescript // app/_layout.tsx (modal) import { Stack } from 'expo-router' export default function RootLayout() { return ( ) } ``` Het bijbehorende scherm gedraagt zich als een gewone route, inclusief ondersteuning voor deep linking en parameters: ```typescript // app/create-post.tsx import { View, TextInput, Button, StyleSheet } from 'react-native' import { router } from 'expo-router' import { useState } from 'react' export default function CreatePostModal() { const [title, setTitle] = useState('') const handleSubmit = () => { router.back() } return (