React Academy · บทเรียน

เส้นทางซ้อนกันและเลย์เอาต์ Outlet

สร้างเลย์เอาต์เส้นทางหลายระดับด้วย แบบซ้อนกันและคอมโพเนนต์

บทเรียน 1 จาก 413 ขั้นตอน

เส้นทางซ้อนกันและเลย์เอาต์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เส้นทางซ้อนกันและเลย์เอาต์ Outlet
  2. ตัวโหลดและแอ็กชัน (Data Router API)
  3. เส้นทางที่มีการป้องกันและตัวตรวจสอบสิทธิ์
  4. การจัดการสถานะในพารามิเตอร์ค้นหาของ URL
← กลับไปที่ React Academy