
رد فعل 19، الذي تم إصداره في أواخر عام 2024 وتم اعتماده على نطاق واسع حتى 2025-2026، يجلب أهم التغييرات منذ الخطافات. يعمل المترجم الجديد ومكونات الخادم والإجراءات والسياق المبسط على إعادة تشكيل كيفية إنشاء تطبيقات React.
📋 Table of Contents
React Compiler – لا مزيد من useMemo/useCallback
يقوم React Compiler تلقائيًا بحفظ المكونات والقيم. إزالة معظمuseMemo,useCallbackوmemo()المكالمات.
// React 18: Manual memoization
const ExpensiveComponent = memo(({ data }) => {
const processed = useMemo(() => processData(data), [data]);
const handleClick = useCallback(() => onClick(data), [data, onClick]);
return <div onClick={handleClick}>{processed}</div>;
});
// React 19: Compiler handles it automatically
function ExpensiveComponent({ data }) {
const processed = processData(data);
return <div onClick={() => onClick(data)}>{processed}</div>;
}
مكونات الخادم
تعمل مكونات الخادم على الخادم، وتصل إلى قواعد البيانات مباشرة، ولا ترسل أي JavaScript إلى العميل. الافتراضي في Next.js 14+.
// app/users/page.tsx — runs on server, no JS sent to client
import { db } from '@/lib/db';
export default async function UsersPage() {
const users = await db.query('SELECT * FROM users LIMIT 10');
return (
<ul>
{users.map(u => <li key={u.id}>{u.name}</li>)}
</ul>
);
}
الإجراءات – الخادم والعميل
تحل الإجراءات محل معالج الأحداث القديم + نمط الجلب. التعامل مع الحالات المعلقة والأخطاء والتحديثات المتفائلة تلقائيًا.
async function createUser(formData: FormData) {
'use server';
const name = formData.get('name') as string;
await db.insert('users', { name });
revalidatePath('/users');
}
export default function CreateUserForm() {
return (
<form action={createUser}>
<input name="name" placeholder="Name" />
<button type="submit">Create</button>
</form>
);
}
خطاف useActionState
المسارات المعلقة، والخطأ، وحالة النجاح تلقائيا. يستبدل useState المطول + التعامل مع النماذج اليدوية.
import { useActionState } from 'react';
async function signUp(prevState, formData) {
const email = formData.get('email');
try {
await createAccount(email);
return { success: true };
} catch (e) {
return { error: e.message };
}
}
function SignUpForm() {
const [state, action, isPending] = useActionState(signUp, null);
return (
<form action={action}>
<input name="email" type="email" />
{state?.error && <p className="error">{state.error}</p>}
{state?.success && <p>Account created!</p>}
<button disabled={isPending}>
{isPending ? 'Creating...' : 'Sign Up'}
</button>
</form>
);
}
use() Hook — غير متزامن في المكونات
قراءة الوعود والسياق في السطر. لا مزيد منuseEffectلجلب البيانات في مكونات العميل.
import { use, Suspense } from 'react';
async function fetchUser(id) {
const res = await fetch(`/api/users/${id}`);
return res.json();
}
function UserCard({ userPromise }) {
const user = use(userPromise); // Suspense-aware
return <div>{user.name}</div>;
}
// In parent:
<Suspense fallback={<Skeleton />}>
<UserCard userPromise={fetchUser(userId)} />
</Suspense>
سياق مبسط
يستخدم موفرو السياق الآن<Context>مباشرة — لا أكثر.Provider.
const ThemeContext = createContext('light');
// React 19: Direct
function App() {
return (
<ThemeContext value="dark">
<Page />
</ThemeContext>
);
}
// React 18: Required .Provider
function App() {
return (
<ThemeContext.Provider value="dark">
<Page />
</ThemeContext.Provider>
);
}
الخلاصة
React 19 هو الإصدار الأكثر ملاءمة للمطورين حتى الآن. يقوم المترجم بإزالة نموذج الأداء، وتقلل مكونات الخادم من حجم الحزمة، وتبسط الإجراءات التعامل مع النموذج. إذا كنت لا تزال تستخدم React 17 أو 18، فقم بالترقية الآن.
🔗 Share this article
✍️ Leave a Comment