ข้ามไปยังเนื้อหาหลัก
sinananr.com
กลับไปหน้าบทความทั้งหมด
App

Expo Router กับการออกแบบ Navigation ที่ถนัดมือ

เทคนิคออกแบบ stack / tab ใน Expo Router ให้ผู้ใช้จำตำแหน่งของตัวเองในแอปได้โดยไม่ต้องคิดเยอะ

สินอนันต์ รูปแก้ว · 22 เมษายน 2568 · 5 นาที
Expo Router navigation

Expo Router เปลี่ยน mental model การ navigation บน React Native ไปจากเดิมโดยสิ้นเชิง — เปลี่ยนจากการ define route ด้วย code มาเป็นการวางไฟล์ตามโครงสร้าง folder แนวคิดเดียวกับ Next.js App Router ทำให้ scale ได้ง่ายและ deep link ทำงานได้ out-of-the-box

ทำไมต้อง file-based routing

ในแอปขนาดใหญ่ การ define route ด้วย code จะเริ่มซับซ้อนเมื่อมี screen หลายสิบตัว File-based routing แก้ปัญหานี้โดยใช้โครงสร้างไฟล์เป็น source of truth — เปิด folder แล้วเห็นทันทีว่าแอปมีหน้าไหนบ้าง

Convention over configuration

Expo Router กำหนด convention ชัด เช่น (tabs) = group ที่มี tab bar, [id] = dynamic route, _layout.tsx = layout wrapper ของ folder นี้ ทำให้ทีมใหม่เข้าใจโครงสร้างแอปได้ภายในไม่กี่นาที

Stack vs Tab vs Modal

การเลือก navigation pattern ที่ถูกเป็นเรื่องสำคัญต่อ UX — Tab เหมาะกับเนื้อหาหลักที่ผู้ใช้สลับไปมา, Stack เหมาะกับ flow ที่มีความต่อเนื่อง (เช่น checkout), Modal เหมาะกับงาน single-task ที่แยกจาก flow ปกติ

ถ้าผู้ใช้ต้องคิดว่า back button จะพาไปไหน — แปลว่าคุณวาง navigation ผิด

Rule of thumb

Tab ไม่ควรเกิน 5 อัน — เกินกว่านี้ไม่มีที่วางและผู้ใช้จำไม่ได้, Stack ไม่ควรลึกเกิน 3-4 ชั้น — ถ้าลึกกว่านั้นให้ design flow ใหม่, Modal ควรมีวิธี dismiss ที่ชัดเจน (swipe down หรือปุ่ม X มุมบน)

Deep linking

File-based routing ทำให้ deep linking ทำงานได้ทันทีโดยไม่ต้อง config ทุก screen มี URL ของตัวเอง ทำให้ share link ในแอปได้เหมือนเว็บ เช่น myapp://posts/abc123 จะพาไปหน้า [id] ใน folder posts/

Universal links

สำหรับ production ต้อง setup Associated Domains (iOS) + assetlinks.json (Android) เพื่อให้ link จากเว็บเปิดในแอปได้ Expo มี EAS Build + app.json config ที่ทำให้ขั้นตอนนี้ไม่ยากเท่าเมื่อก่อน

Tips ที่ใช้ได้จริง

1. Group folders

ใช้ (group) ในชื่อ folder เพื่อจัด route ให้เป็น group โดย URL ไม่เปลี่ยน เหมาะสำหรับแบ่ง code ตาม feature โดย URL ยังสะอาด เช่น (auth)/login, (auth)/register — URL เป็น /login, /register

2. Layout inheritance

_layout.tsx ของแต่ละ folder ทำงานเป็น wrapper ของทุก screen ภายใน ช่วยให้ share context, navigation options, หรือ auth guard ได้สะดวก โดยไม่ต้อง duplicate code ในทุก screen

3. Loading state

ใช้ Suspense + React Query ทำ loading state ได้สวย ไม่ต้องเขียน if (isLoading) return <Spinner /> ทุก screen — ย้ายไปอยู่ใน layout เลยง่ายกว่าเยอะ

สรุป

Expo Router ลด cognitive load ของ team ได้มากสำหรับแอปขนาดกลางขึ้นไป ข้อดีคือ mental model เดียวกับ Next.js ทำให้ full-stack developer ที่ทำเว็บมาก่อนใช้ได้เกือบทันที ส่วนที่ต้องใช้เวลาเรียนคือความรู้เรื่อง React Navigation ที่ยังเป็นตัวจริงเบื้องหลัง

Newsletter

บันทึกการเรียนรู้ที่ส่งมาแบบพอดี ๆ

สมัครไว้ก่อนเพื่อรับบทความใหม่เรื่อง AI, การสร้างแอป, เว็บ, ฐานข้อมูล และการเรียนรู้ที่มีสติ — ไม่สแปม