Dark mode
การจัดการ State ใน React
1. useState
tsx
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
}
2. useReducer
tsx
function reducer(state: number, action: { type: string }) {
switch (action.type) {
case "increment":
return state + 1;
case "decrement":
return state - 1;
default:
return state;
}
}
function Counter() {
const [count, dispatch] = useReducer(reducer, 0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => dispatch({ type: "increment" })}>
Increment
</button>
<button onClick={() => dispatch({ type: "decrement" })}>
Decrement
</button>
</div>
);
}
3. State Lift Up
tsx
function Parent() {
const [value, setValue] = useState("");
return (
<div>
<Child value={value} onChange={setValue} />
<Display value={value} />
</div>
);
}
function Child({ value, onChange }: {
value: string;
onChange: (v: string) => void;
}) {
return (
<input
value={value}
onChange={(e) => onChange(e.target.value)}
/>
);
}
function Display({ value }: { value: string }) {
return <p>You typed: {value}</p>;
}
4. Context API
tsx
// สร้าง Context
const ThemeContext = createContext("light");
// Parent Component
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
// Child Component
function Toolbar() {
const theme = useContext(ThemeContext);
return <div className={theme}>Current Theme: {theme}</div>;
}
5. Zustand (State Management Library)
tsx
// store.ts
import { create } from "zustand";
interface CounterStore {
count: number;
increment: () => void;
decrement: () => void;
}
const useCounterStore = create<CounterStore>((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
decrement: () => set((state) => ({ count: state.count - 1 })),
}));
// Counter.tsx
function Counter() {
const { count, increment, decrement } = useCounterStore();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
}