Lesson 11 / 25
Params and Deep Links
Passing data and opening screens from URLs.
Navigate with identifiers, link from outside
Navigate with <Link href="/product/42"> or the router object (router.push, router.replace, router.back) and read parameters with useLocalSearchParams. In React Navigation you call navigation.navigate("Product", { id: "42" }) and read route.params. Pass small serialisable values such as ids, not whole objects or functions; the screen should load its data from the id so it also works when opened from a link. Deep links open a screen from a URL using a custom scheme (myapp://product/42) configured in app config, while universal links (iOS) and App Links (Android) use your https domain and need verification files on that domain.
Linking to and reading a product screen
Expo Router APIs; check the docs for your version.
// app/(tabs)/index.tsx
import { Link, router } from "expo-router";
import { Pressable, Text } from "react-native";
export default function Home() {
return (
<>
<Link href="/product/42">Open product 42</Link>
<Pressable onPress={() => router.push({ pathname: "/product/[id]", params: { id: "7" } })}>
<Text>Open product 7</Text>
</Pressable>
</>
);
}
// app/product/[id].tsx
import { useLocalSearchParams } from "expo-router";
import { Text } from "react-native";
export default function Product() {
const { id } = useLocalSearchParams<{ id: string }>();
return <Text>Product {id}</Text>; // load the product by id here
}
// app.json: { "expo": { "scheme": "myapp" } } -> myapp://product/42Treat link params as untrusted input
Anyone can craft a deep link. Validate ids and never let a link trigger a sensitive action such as a payment without confirmation.
Quick check: What should you usually pass as a navigation parameter?
- The entire Redux store
- A whole component instance
- A callback function for the next screen
- A small serialisable value such as an id
Answer
A small serialisable value such as an id — Screens load their own data so deep links work too.