Skip to content

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} />;
}