การนำทาง (Navigation) เป็นหนึ่งในองค์ประกอบสำคัญของเว็บแอปพลิเคชัน เพราะมันทำให้ผู้ใช้สามารถเคลื่อนที่ไปมาระหว่างหน้าได้อย่างราบรื่น ใน Next.js ซึ่งเป็น React Framework ที่ได้รับความนิยมสูง เรามีเครื่องมือสองตัวที่ใช้ในการนำทางหลัก ๆ ได้แก่ Link และ useRouter
ในบทความนี้ เราจะมาทำความเข้าใจว่า Link และ useRouter คืออะไร ใช้งานยังไง และมีกรณีไหนบ้างที่ควรใช้ตัวไหน พร้อมตัวอย่างโค้ดที่เข้าใจง่าย
ทำไมต้องใช้ Link และ useRouter?
ใน Next.js เราสามารถใช้ <a href="..."> แบบปกติได้ แต่ปัญหาคือมันจะโหลดหน้าใหม่ทุกครั้งที่คลิกลิงก์ ซึ่งไม่ใช่สิ่งที่เราต้องการสำหรับเว็บแอปที่ต้องการความเร็วและประสิทธิภาพสูง
Link และ useRouter แก้ปัญหานี้ได้อย่างไร?
- Link ช่วยให้เราสามารถทำ client-side navigation ได้โดยที่ไม่ต้องโหลดหน้าใหม่
- useRouter ให้เราควบคุมการนำทางด้วยโค้ด เช่น การเปลี่ยนเส้นทาง (redirect) หรือดึงค่าพารามิเตอร์จาก URL
1. Link – วิธีสร้างลิงก์นำทางแบบง่าย ๆ
ถ้าเราต้องการสร้างลิงก์ระหว่างหน้าต่าง ๆ ใน Next.js วิธีที่ถูกต้องคือใช้ <Link> จาก next/link
ตัวอย่างการใช้งานพื้นฐาน
import Link from 'next/link';
export default function Home() {
return (
<div>
<h1>หน้าแรก</h1>
<Link href="/about">ไปที่หน้า About</Link>
</div>
);
}
✅ ทำไมต้องใช้ Link แทน <a>?
- เมื่อใช้ Link Next.js จะ โหลดหน้าใหม่ให้เร็วขึ้น เพราะมันใช้เทคนิคการ prefetch (โหลดล่วงหน้า)
- ไม่ต้องโหลด HTML ใหม่ทั้งหน้า เหมือนกับ Single Page Application (SPA)
- การใช้งานง่าย ไม่ต้องเขียนโค้ด JavaScript เพิ่ม
2. useRouter – การควบคุมเส้นทางด้วย JavaScript
ในบางกรณี เราอาจต้องนำทางโดยไม่ใช้ <Link> เช่น การเปลี่ยนหน้าเมื่อผู้ใช้กดปุ่ม หรือเปลี่ยนเส้นทางหลังจากทำบางอย่างเสร็จ (redirect)
Next.js มี useRouter จาก next/router ที่ช่วยให้เราควบคุมเส้นทางได้ผ่านโค้ด JavaScript
ตัวอย่างการใช้งาน useRouter เพื่อเปลี่ยนหน้า
import { useRouter } from 'next/router';
export default function Home() {
const router = useRouter();
const goToAbout = () => {
router.push('/about');
};
return (
<div>
<h1>หน้าแรก</h1>
<button onClick={goToAbout}>ไปที่หน้า About</button>
</div>
);
}
✅ router.push(url) ทำอะไรได้บ้าง?
- เปลี่ยนเส้นทางโดยไม่ต้องใช้ <Link>
- ทำให้การเปลี่ยนหน้าเกิดขึ้นจากอีเวนต์ เช่น คลิกปุ่ม หรือส่งฟอร์ม
- รองรับการใช้พารามิเตอร์ใน URL
3. ส่งค่าผ่าน URL ด้วย Query Parameters
ในบางกรณี เราอาจต้องส่งข้อมูลไปพร้อมกับ URL เช่น /profile?user=JohnDoe
วิธีส่งค่าไปยังหน้าอื่น
import { useRouter } from 'next/router';
export default function Home() {
const router = useRouter();
const goToProfile = () => {
router.push({
pathname: '/profile',
query: { user: 'JohnDoe' },
});
};
return (
<div>
<h1>หน้าแรก</h1>
<button onClick={goToProfile}>ไปที่โปรไฟล์ของ John Doe</button>
</div>
);
}
4. ดึงค่าพารามิเตอร์จาก URL
เมื่อเราส่งค่าไปกับ URL แล้ว เราก็ต้องดึงค่ามาใช้ที่หน้าปลายทาง
วิธีดึงค่าจาก query parameters
import { useRouter } from 'next/router';
export default function Profile() {
const router = useRouter();
const { user } = router.query; // ดึงค่าพารามิเตอร์จาก URL
return (
<div>
<h1>โปรไฟล์ของ {user || 'ไม่ทราบชื่อ'}</h1>
</div>
);
}
✅ จุดที่ต้องระวัง
- ค่า router.query อาจเป็น undefined ถ้าหน้าโหลดครั้งแรก ต้องเช็กก่อนใช้
5. นำทางแบบ Dynamic Routing
ถ้าเรามีเส้นทางแบบไดนามิก เช่น /blog/[id] และอยากเปลี่ยนหน้าไปที่ /blog/123 เราสามารถใช้ router.push() ได้แบบนี้
ตัวอย่าง Dynamic Routing
import { useRouter } from 'next/router';
export default function BlogList() {
const router = useRouter();
const goToBlog = (id) => {
router.push(`/blog/${id}`);
};
return (
<div>
<h1>รายการบทความ</h1>
<button onClick={() => goToBlog(123)}>อ่านบทความ 123</button>
</div>
);
}
ที่หน้า /blog/[id].js เราสามารถดึงค่า id จาก URL ได้แบบนี้
import { useRouter } from 'next/router';
export default function BlogPost() {
const router = useRouter();
const { id } = router.query;
return <h1>บทความที่ {id}</h1>;
}
Link กับ useRouter ควรใช้เมื่อไหร่?
กรณี ใช้ Link ใช้ useRouter
ลิงก์ระหว่างหน้า ✅ ❌
นำทางจากปุ่มหรืออีเวนต์ ❌ ✅
ส่งค่าไปกับ URL ❌ ✅
Redirect หลังทำบางอย่างเสร็จ ❌ ✅
ต้องการโหลดล่วงหน้า (prefetch) ✅ ❌
สรุป
- Link ใช้สำหรับการนำทางแบบปกติที่ต้องการให้ Next.js จัดการ prefetch ให้
- useRouter ใช้เมื่อต้องการนำทางด้วยโค้ด JavaScript เช่น การ redirect หรือดึงค่าจาก URL
- Next.js ช่วยให้การนำทางรวดเร็วและมีประสิทธิภาพกว่าการใช้ <a> แบบดั้งเดิม
หวังว่าบทความนี้จะช่วยให้คุณเข้าใจการนำทางใน Next.js มากขึ้น!