Dark mode
Rendering in React (การเรนเดอร์ใน React)
1. Core Concepts
Virtual 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>
);
}
2. Rendering Patterns
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>
);
}
List Rendering
การ 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>
);
}
3. Performance Optimization
React.memo
ช่วยป้องกันการเรนเดอร์ซ้ำเมื่อ props ไม่เปลี่ยนแปลง
tsx
const MemoComponent = React.memo(function MyComponent({ value }) {
// เรนเดอร์เฉพาะเมื่อ props.value เปลี่ยน
return <div>{value}</div>;
});
useMemo
ช่วยจำค่าที่คำนวณไว้เพื่อป้องกันการคำนวณซ้ำ
tsx
function ExpensiveComponent({ items }) {
const sortedItems = useMemo(() => {
return items.sort((a, b) => a.value - b.value);
}, [items]);
return <List items={sortedItems} />;
}
useCallback
ช่วยจำฟังก์ชันไว้เพื่อป้องกันการสร้างฟังก์ชันใหม่ทุกครั้งที่เรนเดอร์
tsx
function Parent() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(c => c + 1);
}, []);
return <Child onClick={increment} />;
}
4. Advanced Techniques
Lazy Loading
tsx
const OtherComponent = React.lazy(() => import("./OtherComponent"));
function MyComponent() {
return (
<Suspense fallback={<div>Loading...</div>}>
<OtherComponent />
</Suspense>
);
}