Skip to main content
0

มาลองใช้ Hook ใน React Router V6 กันเถอะ

สรุปสั้น ๆ

สำหรับคนที่กำลังสนใจหรือกำลังพัฒนาเว็บด้วย React สิ่งที่ขาดไปไม่ได้เลยแน่นอนว่าต้องเป็นการ Route หรือการเปลี่ยนไปที่หน้าต่าง ๆ เพราะเว็บส่วนใหญ่ก็ย่อมมีหลายหน้าเป็นเรื่องปกติ และเครื่องมือที่ใช้สำหรับจัดการการ Route ในวันนี้ก็คือ React router ที่คุ้นเคยกันดี หลายคนก็น่าจะเคยใช้มาแล้วหรือถ้าใครเพิ่งหัดเขียน React ยังไม่เคยแตะมาก่อนเลยก็มาดูกันก่อนได้

เขียนโดย
Pachara Chaicharoen
MidLevel Software Developer

บทความนี้ตีพิมพ์ และ เผยแพร่เมื่อ 25 สิงหาคม 2566

แน่นอนว่าต้อง Install กันก่อน

npm i react-router-dom

บทความนี้จะข้ามเรื่องการ Setup การ Route ออกไป แต่สามารถดูการ Setup เบื้องต้นด้วย Browser Router ได้จาก ลิงก์ด้านล่างนี้

https://reactrouter.com/en/main/router-components/browser-router

และสำหรับมือใหม่หรือมือเก๋าบางครั้งเราก็ต้องการเครื่องมือในการเรียกใช้ข้อมูลเมื่อมีการเปลี่ยนหน้าภายในเว็บไม่ว่าจะเป็นชื่อ Path ปัจจุบันหรือข้อมูลปัจจุบันที่เกิดขึ้นภายใน Router ตัว React Router นี้ก็มี Hook สำหรับให้เราใช้เพื่อดึงข้อมูล ซึ่งปกติการส่งข้อมูลอะไรใน React เราก็รู้กันดีว่าสามารถส่งผ่าน Props ลงมาได้ แต่สำหรับ Hook เราจะสามารถใช้งานมันที่ไหนก็ได้ตราบใดที่อยู่ภายใน Router หรือแม้แต่ Hook สำหรับทำอะไรบางอย่างเช่นการเปลี่ยนหน้าปัจจุบันไปที่หน้าอื่นด้วย เราไปดูกันดีกว่าว่ามีอะไรน่าใช้บ้าง

useParams

https://reactrouter.com/en/main/hooks/use-params

ถ้าเราอยากสร้างหน้าที่มีข้อมูลเปลี่ยนเนื้อหาไปตาม Slug ชื่อ หรือ ID ที่กำหนด useParams เป็นตัวที่น่าจะได้ใช้บ่อย เพราะ Hook นี้จะ return Object ของ Dynamic Params จาก URL ปัจจุบันที่ตรงกับ <Route path> โดยที่ Child Routes จะสืบทอด Params มาจาก Parent Routes ด้วย เช่น

<Route path="users"> 

<Route path=":userId" element={<ProfilePage />} /> 

</Routes>

Route ที่กำหนดแบบนี้จะมี Dynamic Params ชื่อ userId ถ้าเราเข้าด้วย url

/users/16587

ใน Component ProfilePage เราก็จะสามารถเรียกข้อมูล 16587 ที่เป็น userId จาก useParams ได้ตามโค้ดด้านล่างเพื่อเอาไปเป็นข้อมูลเพื่อเรียก api ต่อได้

import * as React from 'react';
import { useParams } from 'react-router-dom';

function ProfilePage() {
 // Get the userId param from the URL.
 let { userId } = useParams();
 // ...
}

useSearchParams

https://reactrouter.com/en/main/hooks/use-search-params

Hook ที่ใช้สำหรับอ่านข้อมูลหรือกำหนด Query String ใน URL ณ ตำแหน่งปัจจุบัน โดย Hook นี้จะมีการใช้เหมือน useState Hook โดยจะมี searchParams เป็นข้อมูล และ setSearchParams เป็นตัว set ข้อมูลลอง import มาแล้วประกาศตามโค้ดด้านล่างได้เลย

 let [searchParams, setSearchParams] = useSearchParams();

โดยถ้า URL path ปัจจุบันเราเป็นแบบนี้

/users/16587?customer=true

แล้วเราลอง console.log(searchParams) ออกมาข้อมูลที่เราจะได้คือ

URLSearchParams {size: 1}

โดยข้อมูลนี้จะเป็น type URLSearchParams ซึ่งเราสามารถใช้ .get(name) เพื่อเรียกข้อมูล customer ที่เราต้องการได้

 console.log(searchParams.get('customer'))

ผลลัพธ์จะได้เป็นข้อมูล Query String ชื่อ Customer ออกมาแล้ว

 true

สำหรับข้อมูล type URLSearchParams ถ้าใครอยากรู้ว่าทำอะไรได้อีกนอกจาก .get ตามไปดูได้เลยที่ https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams

ส่วน setSearchParams เราสามารถใส่เป็น Object ที่มีค่าที่เราต้องการได้เลยเช่นถ้าเราอยากเขียนโค้ดสำหรับแก้ Query String ให้เป็น ?hi=5 ก็เขียนได้แบบนี้

 setSearchParams({hi: '5'})

URL path ของเราก็จะเปลี่ยนจากมี ?customer=true เป็นแบบนี้แทน

/users/16587?hi=5

useSearchParams

https://reactrouter.com/en/main/hooks/use-routes#useroutes

Hook ที่ใช้สำหรับการ Setup Route ที่ใช้ Object แทนการประกาศแบบ Component ที่จะเป็นการสร้างแบบการเอา Component Route มาต่อกันซึ่ง เราสามารถใช้ useRoutes เพื่อสร้างเป็นอีกรูปที่เราสามารถใช้ Object มากำหนดการ Route ได้เช่น

import * as React from "react";
import { useRoutes } from "react-router-dom";

function App() {
 let element = useRoutes([
   {
     path: "/",
     element: ,
     children: [
       {
         path: "messages",
         element: ,
       },
       { path: "tasks", element:  },
     ],
   },
   { path: "team", element:  },
 ]);
 return element;
}

ซึ่ง Object ที่อยู่ใน Array 1 ตัวก็คือการ Route 1 path จากตัวอย่าง Property ในแต่ละ Object ก็จะประกอบไปด้วย
path: ชื่อ Path ที่เราอยากได้
element: Element ที่ต้องการ Render สำหรับ Path นั้น ๆ
children (optional): Child Route ของ Path นั้น ๆ
ซึ่ง children เราสามารถเพิ่มได้เท่าที่เราต้องการเลย

ตัวอย่างการ Setup Route โดยไม่ได้ใช้ useRoutes

<Routes>
 <Route path="/" element={<Dashboard />}>

   <Route
     path="messages"
     element={<DashboardMessages />}
   />
   <Route path="tasks" element={<DashboardTasks />} />
 </Route>
 <Route path="about" element={<AboutPage />} /> 
</Routes>

useLocation

https://reactrouter.com/en/main/hooks/use-location

Hook ที่ใช้สำหรับอ่านข้อมูล Location ปัจจุบัน เช่น pathname ปัจจุบัน ซึ่งข้อมูลนี้จะเปลี่ยนเมื่อ URL มีการเปลี่ยนแปลง มีประโยชน์มากถ้าเราอยาก Handle Event ตอนที่ URL เปลี่ยนแปลงเช่นโค้ดตามตัวอย่าง

import * as React from 'react';
import { useLocation } from 'react-router-dom';

function App() {
 let location = useLocation();
 React.useEffect(() => {
   // Google Analytics
   ga('send', 'pageview');
 }, [location]);

 return (
   // ...
 );
}

คำตอนนี้ก็น่าจะได้รู้จักกับ Hook ไปพอสมควรแล้ว จริง ๆ แล้ว Hook ของ React Router V6 ยังไม่หมดเท่านี้ยังมี Hook อื่น ๆ อีก เช่น useNavigate ที่เราสามารถใช้เพื่อ Redirect ไปที่หน้าต่าง ๆ โดยที่สามารถเลือกการ Replace ได้แต่ตอนนี้ Doc ไม่แนะนำให้ใช้ท่านี้ (ณ ตอนที่เขียนบทความ) หรือ useMatch ที่สามารถเทียบได้ว่า Path ตรงกับที่กำหนดรึเปล่า เผื่อในเคสที่มีการชนกันของ Children Route ที่เป็น Dynamic Route แล้วเราอยากรู้ว่าปัจจุบันเข้าไปอยู่ใน Route ไหนกันแน่

ใครที่ยังไม่เจออันที่กำลังหาอยู่ก็สามารถไปดูเพิ่มเติมได้ใน Doc ของ Official ได้เลย ตอนนี้อาจจะมีมากกว่าที่เคยดูก่อนหน้านี้แล้วกำลังอยากใช้อยู่ก็ได้นะ

https://reactrouter.com/en/main

ระบบฝึกทักษะ การเขียนโปรแกรม

ที่พร้อมตรวจผลงานคุณ 24 ชั่วโมง

  • โจทย์ปัญหากว่า 200 ข้อ ที่รอท้าทายคุณอยู่
  • รองรับ 9 ภาษาโปรแกรมหลัก ไม่ว่าจะ Java, Python, C ก็เขียนได้
  • ใช้งานได้ฟรี ! ครบ 20 ข้อขึ้นไป รับ Certificate ไปเลย !!
เข้าใช้งานระบบ DevLab ฟรี !เรียนรู้เพิ่มเติม

เรียนรู้ไอที “อัพสกิลเขียนโปรแกรม” จากตัวจริง
ปั้นให้คุณเป็น คนสายไอทีระดับมืออาชีพ

3

แนะนำสำหรับคุณ

Close Menu

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า