React Hooks: ฟังก์ชันพิเศษใน React
React Hooks คืออะไร?
React Hooks เป็นฟังก์ชันพิเศษใน React ที่ถูกเพิ่มเข้ามาตั้งแต่เวอร์ชัน 16.8 ซึ่งช่วยให้เราสามารถใช้ฟีเจอร์ต่าง ๆ ของ React เช่น การจัดการสถานะ (state) และการทำงานอื่น ๆ ที่เคยมีเฉพาะใน Class Components มาใช้ใน Function Components ได้ โดยไม่จำเป็นต้องสร้างเป็นคลาสคอมโพเนนต์
ประโยชน์ของการใช้ Hooks:
- ทำให้โค้ดสะอาดและเข้าใจง่ายขึ้น
- ลดความซับซ้อนในการใช้งาน state และ side effects
- ช่วยให้คอมโพเนนต์มีการจัดการสถานะและการทำงานต่าง ๆ ได้อย่างง่ายดาย
การใช้งาน State Hook (useState)
useState เป็น Hook ที่ใช้ในการจัดการสถานะ (state) ภายในฟังก์ชันคอมโพเนนต์ มันจะคืนค่ามาเป็น array ที่ประกอบด้วยตัวแปรสถานะและฟังก์ชันสำหรับอัปเดตสถานะนั้น
import React, { useState } from 'react';
function Counter() {
// ประกาศตัวแปร count และฟังก์ชัน setCount
const [count, setCount] = useState(0);
return (
<div>
<p>คุณคลิก {count} ครั้ง</p>
<button onClick={() => setCount(count + 1)}>คลิกเพิ่ม</button>
</div>
);
}
export default Counter;
อธิบาย:
useState(0)กำหนดค่าเริ่มต้นเป็น0countเป็นค่าของสถานะปัจจุบันsetCountเป็นฟังก์ชันที่ใช้ในการอัปเดตค่าcount
การจัดการ Side Effects ด้วย Effect Hook (useEffect)
useEffect เป็น Hook ที่ใช้จัดการ side effects ภายในฟังก์ชันคอมโพเนนต์ เช่น การเรียกใช้ API การอัปเดต DOM หรือการ subscribe กับข้อมูลภายนอก
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// ใช้ useEffect เพื่อจัดการ side effect
useEffect(() => {
document.title = `คุณคลิก ${count} ครั้ง`;
}, [count]); // ทำงานเมื่อ count เปลี่ยนแปลง
return (
<div>
<p>คุณคลิก {count} ครั้ง</p>
<button onClick={() => setCount(count + 1)}>คลิกเพิ่ม</button>
</div>
);
}
export default Example;
อธิบาย:
- useEffect จะทำงานทุกครั้งเมื่อค่าของ count เปลี่ยน
- สามารถส่ง array ในพารามิเตอร์ที่สอง [count] เพื่อกำหนดว่า effect จะทำงานเมื่อค่าใน array เปลี่ยนแปลงเท่านั้น
การใช้งาน Context Hook (useContext)
useContext เป็น Hook ที่ใช้เพื่อดึงค่าจาก Context ทำให้เราสามารถส่งข้อมูลผ่านหลายๆ คอมโพเนนต์โดยไม่ต้องส่งผ่าน Props
import React, { useContext } from 'react';
const UserContext = React.createContext();
function UserProfile() {
const user = useContext(UserContext);
return <h1>ชื่อผู้ใช้: {user.name}</h1>;
}
function App() {
const user = { name: 'Alice', age: 25 };
return (
<UserContext.Provider value={user}>
<UserProfile />
</UserContext.Provider>
);
}
export default App;
อธิบาย:
- useContext ใช้ในการดึงข้อมูลจาก UserContext ที่ถูกกำหนดไว้ใน
UserContext.Provider
การใช้งาน Memoization Hook (useMemo และ useCallback)
ในบางครั้งการคำนวณค่าใหม่ทุกครั้งเมื่อคอมโพเนนต์ rerender อาจทำให้เกิดประสิทธิภาพที่ต่ำ useMemo และ useCallback ช่วยให้เราสามารถบันทึกผลลัพธ์ของการคำนวณหรือฟังก์ชันเพื่อใช้ซ้ำได้
useMemo :
import React, { useState, useMemo } from 'react';
function ExpensiveCalculationComponent({ num }) {
const expensiveCalculation = (num) => {
console.log('คำนวณใหม่...');
return num * 2;
};
const result = useMemo(() => expensiveCalculation(num), [num]);
return <div>ผลลัพธ์: {result}</div>;
}
useCallback :
import React, { useState, useCallback } from 'react';
function ParentComponent() {
const [count, setCount] = useState(0);
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]);
return <button onClick={handleClick}>เพิ่มจำนวน: {count}</button>;
}
อธิบาย:
useMemoจะบันทึกผลลัพธ์ของฟังก์ชันที่ถูกคำนวณไว้ และจะคำนวณใหม่ก็ต่อเมื่อค่าใน array ที่ส่งไปมีการเปลี่ยนแปลงuseCallbackจะบันทึกฟังก์ชัน และจะสร้างฟังก์ชันใหม่ก็ต่อเมื่อค่าที่กำหนดใน dependency array เปลี่ยนไป
การสร้าง Custom Hooks
คุณสามารถสร้าง Hooks ของคุณเองได้ในรูปแบบ Custom Hooks เพื่อแบ่งปันการใช้งานโค้ดซ้ำๆ ในหลายคอมโพเนนต์ ตัวอย่างเช่น Custom Hook สำหรับการใช้งานการ fetch ข้อมูล:
import { useState, useEffect } from 'react';
function useFetch(url) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url)
.then((response) => response.json())
.then((data) => setData(data));
}, [url]);
return data;
}
function App() {
const data = useFetch('https://api.example.com/data');
return <div>ข้อมูล: {data ? JSON.stringify(data) : 'กำลังโหลด...'}</div>;
}
export default App;
อธิบาย:
- Custom Hook
useFetchใช้ในการดึงข้อมูลจาก API และส่งผลลัพธ์กลับไปยังคอมโพเนนต์ที่เรียกใช้งาน
สรุป
React Hooks เป็นฟีเจอร์ที่ทำให้การจัดการสถานะ การทำงานของ side effects และฟังก์ชันอื่น ๆ ในฟังก์ชันคอมโพเนนต์มีประสิทธิภาพมากขึ้นและสะดวกกว่าเดิม โดยไม่จำเป็นต้องสร้าง class components ทำให้โค้ดสะอาดและเข้าใจง่ายขึ้น นอกจากนี้ Hooks ยังช่วยให้คุณสามารถสร้าง Custom Hooks เพื่อใช้งานซ้ำได้ในหลายๆ คอมโพเนนต์

