เส้นทางซ้อนกันและเลย์เอาต์ Outlet
สร้างเลย์เอาต์เส้นทางหลายระดับด้วย แบบซ้อนกันและคอมโพเนนต์
เส้นทางซ้อนกันและเลย์เอาต์ Outlet เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
เส้นทางซ้อนคืออะไร
เส้นทางซ้อนใน React Router v6 ช่วยให้คุณประกอบเลย์เอาต์ได้ โดยเส้นทางแม่จะแสดงโครงหลัก (แถบนำทางและแถบด้านข้าง) ส่วนเส้นทางลูกจะเติมเนื้อหาผ่าน <Outlet />
การกำหนดเส้นทางซ้อน
วางองค์ประกอบ <Route> ของเส้นทางลูกไว้ภายใน <Route> ของเส้นทางแม่ในการกำหนดค่าเราเตอร์ โดยพาธของเส้นทางแม่จะเป็นคำนำหน้าของเส้นทางลูกทั้งหมด
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
children: [
{ path: 'dashboard', element: <Dashboard /> },
{ path: 'settings', element: <Settings /> },
],
},
]);คอมโพเนนต์ Outlet
<Outlet /> เป็นพื้นที่สำรองในคอมโพเนนต์เลย์เอาต์ของเส้นทางแม่ React Router จะแทนที่พื้นที่นี้ด้วยองค์ประกอบของเส้นทางลูกที่ตรงกัน
function RootLayout() {
return (
<div>
<nav>
<Link to="/dashboard">Dashboard</Link>
<Link to="/settings">Settings</Link>
</nav>
<main>
<Outlet /> {/* child route renders here */}
</main>
</div>
);
}เส้นทางดัชนี
เส้นทางที่มี index: true จะแสดงเมื่อ URL ของเส้นทางแม่ตรงกันทุกประการ โดยทำหน้าที่เป็นเส้นทางลูกเริ่มต้นเมื่อไม่มีพาธของเส้นทางลูกอื่นตรงกัน
{
path: '/',
element: <RootLayout />,
children: [
{ index: true, element: <Home /> }, // renders at '/'
{ path: 'about', element: <About /> },
],
}การซ้อนหลายระดับ
เส้นทางสามารถซ้อนกันได้หลายระดับ คอมโพเนนต์เลย์เอาต์แต่ละตัวในสายการซ้อนจะแสดง <Outlet /> สำหรับเส้นทางลูกของตนเอง
const router = createBrowserRouter([
{
path: '/app',
element: <AppShell />,
children: [
{
path: 'users',
element: <UsersLayout />,
children: [
{ index: true, element: <UserList /> },
{ path: ':id', element: <UserDetail /> },
],
},
],
},
]);บริบทของ Outlet
ส่งข้อมูลจากเลย์เอาต์ไปยังเส้นทางลูกที่ซ้อนอยู่ผ่านพร็อพ context ของ <Outlet /> แล้วอ่านข้อมูลด้วย useOutletContext() ในเส้นทางลูก
// Parent layout
function UsersLayout() {
const [selected, setSelected] = useState(null);
return <Outlet context={{ selected, setSelected }} />;
}
// Child route
function UserDetail() {
const { selected } = useOutletContext();
return <div>{selected}</div>;
}เลย์เอาต์ที่มีชื่อด้วยเส้นทางที่ไม่มีพาธ
เส้นทางที่ไม่มี path จะครอบเส้นทางลูกไว้เพื่อจัดเลย์เอาต์เท่านั้น โดยไม่เพิ่มส่วนใดใน URL เหมาะสำหรับจัดกลุ่มเส้นทางที่ใช้เลย์เอาต์ร่วมกัน
{
element: <AuthenticatedLayout />, // no path
children: [
{ path: '/profile', element: <Profile /> },
{ path: '/billing', element: <Billing /> },
],
}ลิงก์สัมพัทธ์ในเส้นทางซ้อน
ภายในเส้นทางซ้อน <Link to='sibling'> จะอ้างอิงโดยสัมพันธ์กับพาธของเส้นทางปัจจุบัน เช่นเดียวกับ URL สัมพัทธ์ใน HTML
// Inside /app/users — link goes to /app/users/new
function UserList() {
return <Link to="new">Add User</Link>;
}useMatch ในเส้นทางซ้อน
useMatch(pattern) จะส่งคืนข้อมูลการจับคู่เมื่อ URL ปัจจุบันตรงกับรูปแบบที่กำหนด เหมาะสำหรับกำหนดรูปแบบให้ลิงก์ที่กำลังใช้งานในเลย์เอาต์ซ้อน
function NavLink({ to, children }) {
const match = useMatch(to);
return (
<Link to={to} className={match ? 'active' : ''}>
{children}
</Link>
);
}ขอบเขตจัดการข้อผิดพลาดแยกตามส่วน
เพิ่ม errorElement ให้กับเส้นทางซ้อนใดก็ได้ เพื่อดักจับข้อผิดพลาดเฉพาะในส่วนนั้นโดยไม่ทำให้โครงเลย์เอาต์ทั้งหมดหยุดทำงาน
{
path: 'users',
element: <UsersLayout />,
errorElement: <UsersError />,
children: [
{ path: ':id', element: <UserDetail /> },
],
}รูปแบบการใช้งานจริง: เลย์เอาต์แดชบอร์ด
แดชบอร์ดทั่วไปใช้เส้นทางระดับบนสุดสำหรับโครงแอป (ส่วนหัวและแถบด้านข้าง) พร้อมเส้นทางซ้อนสำหรับแต่ละส่วน ทำให้โครงแอปยังคงอยู่ขณะที่เปลี่ยนเฉพาะพื้นที่เนื้อหา
function DashboardShell() {
return (
<div className="dashboard">
<Sidebar />
<div className="content">
<Outlet />
</div>
</div>
);
}ตรวจสอบอย่างรวดเร็ว
คอมโพเนนต์ใดที่เลย์เอาต์ของเส้นทางแม่ต้องแสดงเพื่อแสดงเส้นทางลูกที่ตรงกัน
สรุปทบทวน
เส้นทางซ้อนช่วยให้เส้นทางแม่แสดงเลย์เอาต์ที่คงอยู่ตลอด ขณะที่เส้นทางลูกเติมเนื้อหาลงใน <Outlet /> ใช้เส้นทางดัชนีสำหรับเส้นทางลูกเริ่มต้น ใช้เส้นทางที่ไม่มีพาธสำหรับเลย์เอาต์ร่วม และใช้ useOutletContext เพื่อส่งข้อมูลลงไป
เรียนรู้ React ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 88
- บทเรียน
- 324
คำถามที่พบบ่อย
บทเรียน “เส้นทางซ้อนกันและเลย์เอาต์ Outlet” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เส้นทางซ้อนกันและเลย์เอาต์ Outlet” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เส้นทางซ้อนกันและเลย์เอาต์ Outlet”
สร้างเลย์เอาต์เส้นทางหลายระดับด้วย แบบซ้อนกันและคอมโพเนนต์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เส้นทางซ้อนกันและเลย์เอาต์ Outlet” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เส้นทางซ้อนกันและเลย์เอาต์ Outlet
- ตัวโหลดและแอ็กชัน (Data Router API)
- เส้นทางที่มีการป้องกันและตัวตรวจสอบสิทธิ์
- การจัดการสถานะในพารามิเตอร์ค้นหาของ URL