CodeShot

useState در مقابل useReducer

useState یک مقدار وضعیت ساده را نگه می‌دارد و به‌طور مستقیم با یک تابع Setter به‌روزرسانی می‌شود، در حالی که useReducer وضعیت را از طریق یک تابع Reducer و ارسال Action ها مدیریت می‌کند و برای وضعیت‌های پیچیده با چند فیلد مرتبط و منطق تغییر پیچیده‌تر مناسب‌تر است.

ویژگیuseStateuseReducer
پیچیدگی وضعیتسادهپیچیده و چندفیلدی
الگوی به‌روزرسانیSetter مستقیمDispatch با Action
قابلیت تست منطق تغییرمحدودتربالا (Reducer خالص)

کِی از useState استفاده کنیم؟

وقتی وضعیت ساده است، مثل یک مقدار بولی، رشته یا عدد که مستقل از سایر وضعیت‌ها تغییر می‌کند.

کِی از useReducer استفاده کنیم؟

وقتی چند فیلد وضعیت به‌هم وابسته‌اند، منطق به‌روزرسانی پیچیده است یا می‌خواهید تغییرات وضعیت را قابل پیش‌بینی‌تر و متمرکز کنید.

مثال useState

const [count, setCount] = useState(0);
<button onClick={() => setCount(count + 1)}>+</button>

مثال useReducer

function reducer(state, action) {
  switch (action.type) {
    case "increment": return { count: state.count + 1 };
    default: return state;
  }
}
const [state, dispatch] = useReducer(reducer, { count: 0 });

اشتباه رایج

اشتباه رایج استفاده از چند useState جداگانه برای وضعیت‌های به‌شدت به‌هم‌وابسته است؛ این کار باعث می‌شود همگام نگه‌داشتن آن‌ها در به‌روزرسانی‌های همزمان دشوار شود، در حالی که useReducer با یک منبع واحد وضعیت این مشکل را حل می‌کند.

جمع‌بندی

برای وضعیت‌های ساده و مستقل از useState و برای وضعیت‌های پیچیده و به‌هم‌وابسته با منطق تغییر روشن از useReducer استفاده کنید.