Dark mode
Rendering in React (การเรนเดอร์ใน React)
Virtual DOM (DOM เสมือน)
Virtual DOM เป็นแนวคิดหลักของ React ที่ช่วยเพิ่มประสิทธิภาพการอัปเดต UI โดยการสร้าง representation ของ DOM ในหน่วยความจำก่อน แล้วจึงอัปเดต DOM จริงเฉพาะส่วนที่เปลี่ยนแปลง
tsx
function App() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
}
Reconciliation (กระบวนการประสาน)
กระบวนการที่ React ใช้เปรียบเทียบ Virtual DOM เก่ากับใหม่ เพื่อหาว่าต้องอัปเดต DOM จริงส่วนใดบ้าง
tsx
// React จะทำการ reconcile เฉพาะส่วนที่เปลี่ยนเท่านั้น
function UserList({ users }) {
return (
<ul>
{users.map(user => <UserItem key={user.id} user={user} />)}
</ul>
);
}
List Rendering (การเรนเดอร์ลิสต์)
การ Render List พื้นฐาน
การ render list ใน React ใช้ method map() เพื่อแปลง array ของข้อมูลเป็น array ของ Component โดยต้องระบุ key ที่เป็น unique ให้แต่ละ element
tsx
function NumberList() {
const numbers = [1, 2, 3, 4, 5];
return (
<ul>
{numbers.map((number) => (
<li key={number.toString()}>
{number}
</li>
))}
</ul>
);
}
Conditional Rendering (การเรนเดอร์แบบมีเงื่อนไข)
1. การใช้ if-else
การใช้ if-else เป็นวิธีพื้นฐานสำหรับการแสดงผลตามเงื่อนไข
tsx
function Greeting({ isLoggedIn }: { isLoggedIn: boolean }) {
if (isLoggedIn) {
return <h1>Welcome back!</h1>;
} else {
return <h1>Please sign in.</h1>;
}
}
2. การใช้ Ternary Operator
Ternary Operator เหมาะสำหรับการแสดงผลแบบสั้นๆ ในบรรทัดเดียว
tsx
function UserStatus({ isOnline }: { isOnline: boolean }) {
return (
<div>
User is {isOnline ? "Online" : "Offline"}
</div>
);
}
3. การใช้ Logical && Operator
การใช้ && Operator เหมาะสำหรับการแสดงผล Component เมื่อเงื่อนไขเป็นจริงเท่านั้น
tsx
function Notification({ hasUnread }: { hasUnread: boolean }) {
return (
<div>
{hasUnread && <span className="badge">New</span>}
</div>
);
}
React.memo (การจำผลลัพธ์)
ช่วยป้องกันการเรนเดอร์ซ้ำเมื่อ props ไม่เปลี่ยนแปลง
tsx
const MemoComponent = React.memo(function MyComponent({ value }) {
// เรนเดอร์เฉพาะเมื่อ props.value เปลี่ยน
return <div>{value}</div>;
});
useMemo Hook
ช่วยจำค่าที่คำนวณไว้เพื่อป้องกันการคำนวณซ้ำ
tsx
function ExpensiveComponent({ items }) {
const sortedItems = useMemo(() => {
return items.sort((a, b) => a.value - b.value);
}, [items]);
return <List items={sortedItems} />;
}
useCallback Hook
ช่วยจำฟังก์ชันไว้เพื่อป้องกันการสร้างฟังก์ชันใหม่ทุกครั้งที่เรนเดอร์
tsx
function Parent() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(c => c + 1);
}, []);
return <Child onClick={increment} />;
}