رویکرد: استفاده از context و portal
// ModalContext.tsx
const ModalContext = createContext(null);
export const useModal = () => useContext(ModalContext);
export function ModalProvider({ children }) {
const [content, setContent] = useState(null);
return (
<ModalContext.Provider value=>
{children}
{content &&
ReactDOM.createPortal(
<div className="modal-backdrop">{content}</div>,
document.body
)}
</ModalContext.Provider>
);
}
نحوه استفاده:
const { setContent } = useModal();
setContent(<MyModalContent onClose={() => setContent(null)} />);
رویکرد:
Promise.all یا async/awaituseEffectuseEffect(() => {
const fetchData = async () => {
const [user, posts] = await Promise.all([
fetch("/api/user").then((res) => res.json()),
fetch("/api/posts").then((res) => res.json()),
]);
setData({ user, posts });
};
fetchData();
}, []);
نکته اضافه: مدیریت وضعیت بارگذاری/خطا و استفاده از AbortController برای پاکسازی
رویکرد:
shared/ابزار: استفاده از @dnd-kit/core یا react-beautiful-dnd
مثال با react-beautiful-dnd:
<DragDropContext onDragEnd={handleDragEnd}>
<Droppable droppableId="list">
{(provided) => (
<ul {...provided.droppableProps} ref={provided.innerRef}>
{items.map((item, index) => (
<Draggable key={item.id} draggableId={item.id} index={index}>
{(provided) => (
<li
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
{item.name}
</li>
)}
</Draggable>
))}
{provided.placeholder}
</ul>
)}
</Droppable>
</DragDropContext>
معماری:
استراتژی کامپوننتها:
زیرساخت:
رویکرد:
API کلی:
<DataTable
data={data}
columns={[
{ key: "name", label: "Name", sortable: true },
{ key: "email", label: "Email" },
]}
pagination=
onSort={(key, direction) => {}}
onFilter={(query) => {}}
/>
نکات پیادهسازی:
useMemo برای دادههای مشتقشدهبرنامه:
استراتژیها:
SWR یا React Query) برای جلوگیری از درخواست تکراریconst fetcher = async (url) => {
const res = await fetch(url);
if (res.status === 429) {
await new Promise((r) => setTimeout(r, 1000)); // simple backoff
return fetcher(url);
}
return res.json();
};