Dark mode
Functional Components (คอมโพเนนต์แบบฟังก์ชัน) - วิธีเขียนคอมโพเนนต์ React สมัยใหม่ที่ใช้ฟังก์ชันแทนคลาส
tsx
// คอมโพเนนต์แบบฟังก์ชัน แทนการใช้แบบ Class
const Counter = () => {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;
};
Hooks (ฮุค) - ฟังก์ชันพิเศษที่ให้คุณใช้ฟีเจอร์ของ React โดยไม่ต้องเขียนคลาส
typescript
// ฮุคพื้นฐาน: useState, useEffect, useContext
import { useEffect, useState } from "react";
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `คลิกไปแล้ว ${count} ครั้ง`;
}, [count]);
}
Type Safety (ประเภทความปลอดภัย) - ช่วยจับข้อผิดพลาดก่อนรันโปรแกรม
typescript
// ใช้ TypeScript กับ React (TSX)
interface UserProps {
id: number;
name: string;
email: string;
}
const User: React.FC<UserProps> = ({ id, name, email }) => {
return <div>{name} ({email})</div>;
};
Component Structure (โครงสร้างคอมโพเนนต์) - จัดระเบียบโค้ดให้เป็นแบบแผน
tsx
// แบบแผนการจัดโครงสร้างคอมโพเนนต์
import { useEffect, useState } from "react";
import styles from "./Button.module.css";
// ฮุคและตัวแปร
// ฟังก์ชันช่วยเหลือ
// คอมโพเนนต์และการ return JSX
State Management (การจัดการสถานะ) - วิธีเก็บข้อมูลที่แชร์กันหลายคอมโพเนนต์
typescript
// ใช้ Context API สำหรับการจัดการสถานะ
import { createContext, useContext, useState } from "react";
const CounterContext = createContext(null);
export const CounterProvider = ({ children }) => {
const [count, setCount] = useState(0);
return (
<CounterContext.Provider value={{ count, setCount }}>
{children}
</CounterContext.Provider>
);
};
// หรือใช้ Zustand สำหรับ global state
import create from "zustand";
const useStore = create((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
}));
Custom Hooks (ฮุคที่สร้างเอง) - แยกโค้ดที่ใช้บ่อยเป็นฮุคเพื่อใช้ซ้ำได้
typescript
// แยก logic ที่ใช้บ่อยเป็น custom hook
export function useCounter(initialValue = 0) {
const [count, setCount] = useState(initialValue);
const increment = () => setCount(prev => prev + 1);
const decrement = () => setCount(prev => prev - 1);
return { count, increment, decrement };
}
// นำไปใช้
function Counter() {
const { count, increment } = useCounter();
return <button onClick={increment}>{count}</button>;
}
Props (พร็อพส์) - วิธีส่งข้อมูลจากคอมโพเนนต์พ่อไปยังคอมโพเนนต์ลูก
typescript
// การส่งและรับ props
interface ButtonProps {
text: string;
onClick?: () => void;
variant?: "primary" | "secondary";
}
const Button: React.FC<ButtonProps> = ({
text,
onClick,
variant = "primary",
}) => {
return (
<button
className={`btn btn-${variant}`}
onClick={onClick}
>
{text}
</button>
);
};
Event Handling (จัดการอีเวนต์) - วิธีจัดการกับเหตุการณ์ต่างๆ บนหน้าเว็บ
tsx
// การจัดการอีเวนต์
function Form() {
const [name, setName] = useState("");
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
console.log("Submitting:", name);
};
return (
<form onSubmit={handleSubmit}>
<input
value={name}
onChange={(e) => setName(e.target.value)}
/>
<button type="submit">ส่ง</button>
</form>
);
}
CSS in React (CSS ใน React) - วิธีจัดการสไตล์ในแอปพลิเคชัน React
tsx
// ใช้ CSS Modules
import styles from "./Button.module.css";
function Button() {
return <button className={styles.button}>คลิก</button>;
}
// หรือใช้ styled-components
import styled from "styled-components";
const StyledButton = styled.button`
background: ${props => props.primary ? "blue" : "white"};
color: ${props => props.primary ? "white" : "blue"};
padding: 8px 16px;
`;
Conditional Rendering (การแสดงผลตามเงื่อนไข) - แสดงหรือซ่อน UI ตามเงื่อนไข
tsx
// การแสดงผลตามเงื่อนไข
function UserStatus({ isLoggedIn }) {
return (
<div>
{isLoggedIn ? <button>ออกจากระบบ</button> : <button>เข้าสู่ระบบ</button>}
{isLoggedIn && <ProfileSettings />}
</div>
);
}
Lists and Keys (ลิสต์และคีย์) - วิธีแสดงข้อมูลเป็นรายการและใช้คีย์อย่างถูกต้อง
tsx
// การแสดงผลรายการข้อมูล
function UserList({ users }) {
return (
<ul>
{users.map(user => <li key={user.id}>{user.name}</li>)}
</ul>
);
}
Lazy Loading (โหลดแบบขี้เกียจ) - โหลดคอมโพเนนต์เมื่อจำเป็นเท่านั้น
typescript
// ใช้ React.lazy และ Suspense
import { lazy, Suspense } from "react";
const LazyComponent = lazy(() => import("./LazyComponent"));
function App() {
return (
<Suspense fallback={<div>กำลังโหลด...</div>}>
<LazyComponent />
</Suspense>
);
}
Error Handling (จัดการข้อผิดพลาด) - วิธีจัดการกับข้อผิดพลาดที่เกิดขึ้น
tsx
// ใช้ Error Boundaries
import { Component, ErrorInfo, ReactNode } from "react";
class ErrorBoundary extends Component<
{ children: ReactNode; fallback: ReactNode },
{ hasError: boolean }
> {
state = { hasError: false };
static getDerivedStateFromError() {
return { hasError: true };
}
componentDidCatch(error: Error, info: ErrorInfo) {
console.error("เกิดข้อผิดพลาด:", error, info);
}
render() {
if (this.state.hasError) {
return this.props.fallback;
}
return this.props.children;
}
}
Modern Tooling (เครื่องมือสมัยใหม่) - เครื่องมือที่ช่วยให้พัฒนาแอปพลิเคชันง่ายขึ้น
bash
# ใช้ Vite เพื่อสร้างโปรเจ็กต์ React
npm create vite@latest my-app -- --template react-ts
หมายเหตุ:
- ใช้ฟังก์ชันคอมโพเนนต์แทนคลาสคอมโพเนนต์
- ใช้ฮุคเพื่อจัดการสถานะและเอฟเฟ็กต์
- แยกโลจิกที่ใช้บ่อยเป็น custom hooks
- ใช้ TypeScript สำหรับการตรวจสอบประเภทข้อมูล
- ใช้ Context API หรือ Zustand สำหรับการจัดการสถานะทั่วทั้งแอป