React Academy · บทเรียน

การปรับโครงสร้าง HOC เป็น Custom Hook

แปลง HOC ของ withAuth เป็นฮุก useAuth ทีละขั้นตอน

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

การปรับโครงสร้าง HOC เป็น Custom Hook เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะปรับโครงสร้าง HOC withAuth เป็นฮุกแบบกำหนดเอง useAuth ทีละขั้นตอน พร้อมเห็นอย่างชัดเจนว่าเหตุใดฮุกจึงสะอาดและทดสอบได้ง่ายกว่า

HOC withAuth (จุดเริ่มต้น)

HOC จะรับคอมโพเนนต์ ตรวจสอบว่าผู้ใช้ยืนยันตัวตนแล้วหรือไม่ และเปลี่ยนเส้นทางไปที่ /login หากยังไม่ได้ยืนยันตัวตน HOC จะแทรกผู้ใช้เป็นพร็อพ
function withAuth(Component) {
  return function AuthGuard(props) {
    const { user, loading } = useAuthState();
    if (loading) return <Spinner />;
    if (!user) return <Navigate to="/login" />;
    return <Component {...props} user={user} />;
  };
}

const ProtectedPage = withAuth(MyPage);

ปัญหาของ HOC

HOC (1) เพิ่มตัวห่อหุ้มใน DevTools (2) แทรกพร็อพ `user` โดยปริยาย ทำให้คอมโพเนนต์ต้องรู้ว่าจะได้รับพร็อพนี้ (3) ทดสอบได้ยากหากไม่แสดงผลตัวห่อหุ้ม HOC ทั้งหมด และ (4) ประกอบใช้งานร่วมกับฮุกอื่นได้ไม่ง่าย

ขั้นตอนที่ 1: แยกตรรกะออกเป็นฮุก

ย้ายตรรกะทั้งหมดจาก HOC ไปไว้ในฮุกแบบกำหนดเอง ฮุกจะส่งคืนสถานะการยืนยันตัวตนโดยตรง ไม่ต้องห่อหุ้มและไม่ต้องแทรกพร็อพ
function useAuth() {
  const { user, loading } = useAuthState();
  return { user, loading, isAuthenticated: !!user };
}

ขั้นตอนที่ 2: จัดการการเปลี่ยนเส้นทางในฮุก

ย้ายตรรกะการเปลี่ยนเส้นทางไปไว้ในฮุกแยกต่างหาก เช่น useRequireAuth ซึ่งเรียก navigate ภายในและส่งคืนผู้ใช้
function useRequireAuth(redirectTo = '/login') {
  const { user, loading } = useAuth();
  const navigate = useNavigate();

  useEffect(() => {
    if (!loading && !user) navigate(redirectTo);
  }, [user, loading, navigate, redirectTo]);

  return { user, loading };
}

ขั้นตอนที่ 3: อัปเดตคอมโพเนนต์

แทนที่ตัวห่อหุ้ม HOC ด้วยการเรียกใช้ฮุกโดยตรงภายในคอมโพเนนต์ คอมโพเนนต์จะเรียก useRequireAuth อย่างชัดเจนและจัดการสถานะกำลังโหลด ตอนนี้จึงมองเห็นสิ่งที่คอมโพเนนต์ต้องพึ่งพาได้แล้ว
function MyPage() {
  const { user, loading } = useRequireAuth();
  if (loading) return <Spinner />;
  return <p>Hello, {user.name}</p>;
}

เปรียบเทียบข้อดี

ฮุกมีข้อดีดังนี้ (1) ไม่มีตัวห่อหุ้มเพิ่มเติมใน DevTools (2) เห็นสิ่งที่ต้องพึ่งพาอย่างชัดเจน โดยมองเห็น `useRequireAuth` ในคอมโพเนนต์ (3) ทดสอบได้ด้วยการจำลองฮุก และ (4) ประกอบใช้งานร่วมกับฮุกอื่นในคอมโพเนนต์เดียวกันได้

ทดสอบเวอร์ชันฮุก

จำลอง useRequireAuth ในการทดสอบโดยแทนที่การส่งออกของโมดูล การทดสอบคอมโพเนนต์ต้องแสดงผลคอมโพเนนต์และตรวจสอบเอาต์พุตเท่านั้น ไม่จำเป็นต้องตั้งค่า HOC
vi.mock('./useRequireAuth', () => ({
  useRequireAuth: () => ({ user: mockUser, loading: false })
}));

render(<MyPage />);
expect(screen.getByText('Hello, Alice')).toBeInTheDocument();

เมื่อใดควรเก็บ HOC ไว้

เก็บ HOC ไว้หากคุณต้องการป้องกันคอมโพเนนต์หลายรายการแบบประกาศ เช่น ในคำจำกัดความของเส้นทาง และไม่ต้องการเพิ่มการเรียกใช้ฮุกให้แต่ละคอมโพเนนต์ คุณยังสามารถสร้าง HOC โดยใช้ฮุกเป็นพื้นฐานได้ด้วย โดยสร้าง ON TOP ของฮุกนั้น
function withAuth(Component) {
  return function (props) {
    const { user, loading } = useRequireAuth();
    if (loading) return <Spinner />;
    return <Component {...props} user={user} />;
  };
}

ข้อดีของทั้งสองแนวทาง

สถาปัตยกรรมสุดท้ายคือ มีฮุก useRequireAuth สำหรับเรียกใช้โดยตรงในคอมโพเนนต์ AND มี HOC withAuth แบบบางที่สร้าง ON TOP ของฮุกนั้นเพื่อป้องกันเส้นทางแบบประกาศ ทั้งสองส่วนใช้ตรรกะฮุกเดียวกันร่วมกัน

ตรวจสอบความเข้าใจ

ประโยชน์หลักของการเรียก useRequireAuth ภายในคอมโพเนนต์แทนการห่อหุ้มด้วย HOC withAuth คืออะไร

สรุปทบทวน

ปรับโครงสร้าง HOC เป็นฮุกโดยแยกตรรกะออกเป็นฮุกแบบกำหนดเอง ย้ายผลข้างเคียง เช่น การเปลี่ยนเส้นทาง ไปไว้ในฮุก และเรียกใช้ฮุกโดยตรงในคอมโพเนนต์ เมื่อจำเป็นต้องห่อหุ้มแบบประกาศ ให้สร้าง HOC แบบบางบนฮุกนั้น

เรียนจบหลักสูตรแล้ว

ขอแสดงความยินดีด้วยค่ะ คุณเรียนจบ **รูปแบบ React: พร็อพสำหรับการเรนเดอร์และ HOC** แล้ว ตอนนี้คุณเข้าใจรูปแบบคลาสสิกทั้งสองแบบ ข้อแลกเปลี่ยนของแต่ละแบบ และวิธีปรับโครงสร้างให้เป็นฮุกแบบกำหนดเองสมัยใหม่แล้ว
เริ่มต้นได้ฟรี

เรียนรู้ React ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
88
บทเรียน
324

คำถามที่พบบ่อย

บทเรียน “การปรับโครงสร้าง HOC เป็น Custom Hook” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การปรับโครงสร้าง HOC เป็น Custom Hook” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การปรับโครงสร้าง HOC เป็น Custom Hook”

แปลง HOC ของ withAuth เป็นฮุก useAuth ทีละขั้นตอน คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การปรับโครงสร้าง HOC เป็น Custom Hook” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. รูปแบบ Render Props
  2. ทำความเข้าใจคอมโพเนนต์ลำดับสูง (HOC)
  3. HOC กับ Render Props และ Custom Hooks
  4. การปรับโครงสร้าง HOC เป็น Custom Hook
← กลับไปที่ React Academy