React 19 هي الإصدار الرئيسي من React الذي صدر في ديسمبر 2024. تضيف الإجراءات (Actions، وهي دوال غير متزامنة تدير حالة الانتظار والأخطاء والنماذج)، والخطافات useActionState وuseOptimistic وuse، وref كـ prop عادية، ووسوم <title> و<meta> التي تنقلها React إلى رأس المستند. وأضافت React 19.2 (أكتوبر 2025) المكوّن <Activity> والخطاف useEffectEvent.
كل مثال أدناه يعمل على React 19.2. إليك إجراءً: دالة غير متزامنة تُمرَّر إلى نموذج، مع حالة الانتظار والخطأ المُرجع اللذين يتولاهما useActionState.
اضغط Save والحقل فارغ لترى الخطأ، ثم اكتب اسمًا واحفظ: يقرأ الزر "Saving..." لمدة 800 جزء من الثانية. لا يوجد useState للخطأ، ولا علامة isLoading، ولا e.preventDefault().
الإجراءات وإجراءات النماذج
في React 18 كنت تكتب الخطوات نفسها لكل نموذج: منع الإرسال الافتراضي، وضبط علامة تحميل، وانتظار الطلب، وتخزين خطأ، ومسح العلامة. تسمي React 19 الدالة التي تؤدي عملًا غير متزامن داخل انتقال إجراءً (Action)، وتتولى هذا الحساب نيابة عنك.
- صارت
startTransition(وuseTransition) تقبل دالة غير متزامنة. وتبقىisPendingقيمتهاtrueحتى تنتهي الدالة كلها. - يستدعي
<form action={fn}>الدالةfnمعFormDataالخاص بالنموذج عند إرساله. وتعمل كإجراء، وبعد انتهائها تعيد React ضبط الحقول غير المتحكم بها في النموذج. - يعطي
<button formAction={fn}>زر إرسال واحدًا إجراءه الخاص. - يحتفظ useActionState بالقيمة التي أرجعها الإجراء آخر مرة، فيستطيع الإجراء إرجاع رسالة خطأ أو السجل المحفوظ.
- يتيح
useFormStatusمنreact-domلمكوّن داخل نموذج أن يقرأ ما إذا كان ذلك النموذج قيد الإرسال، دون تمرير props إلى الأسفل. ويحتاج إلى<form>أب، لذا يظهر هنا في كتلة ثابتة:
import { useFormStatus } from 'react-dom';
function SubmitButton() {
const { pending } = useFormStatus();
return <button disabled={pending}>{pending ? 'Sending...' : 'Send'}</button>;
}
useOptimistic
يعرض useOptimistic النتيجة التي تتوقعها بينما ما زال الإجراء يعمل، ويعود إلى الحالة الحقيقية عندما ينتهي الإجراء. يمكن لعدّاد الإعجابات أن يرتفع لحظة نقرك، وأن يعود إلى الأسفل إذا فشل الطلب.
const [optimisticLikes, addOptimisticLike] = useOptimistic(likes, (current, delta) => current + delta);
في صفحة useOptimistic مثال قابل للتشغيل بواجهة برمجية وهمية تفشل عمدًا، لتراقب التراجع.
الواجهة use
تقرأ use قيمة من وعد أو من سياق. مع الوعد تعلّق المكوّن حتى يُحل الوعد، ويعرض أقرب <Suspense> بديله في الأثناء. وخلافًا لكل خطاف آخر، يمكن استدعاء use داخل if أو حلقة، وبعد return مبكر.
وتتيح React 19 أيضًا عرض <ThemeContext value="dark"> مباشرة بدلًا من <ThemeContext.Provider>. يظهر الاثنان في هذا المثال:
ref كـ prop، وتنظيف المراجع
صار مكوّن الدالة يستقبل ref مثل أي prop أخرى. لم تعد تحتاج إلى تغليفه بـ forwardRef لتمرير مرجع إلى عنصر DOM.
ويمكن لدالة المرجع أيضًا أن تُرجع دالة تنظيف. تستدعيها React عندما يغادر العنصر الشاشة، بالطريقة نفسها التي تعمل بها دالة تنظيف التأثير. أما دالة المرجع التي لا تُرجع شيئًا فما زالت تُستدعى بـ null عند الإزالة، كما في React 18.
انقر الزر بضع مرات واقرأ وحدة التحكم: كل إزالة تسجّل سطر التنظيف، وكل عودة تسجّل attached to DIV.
البيانات الوصفية للمستند
يمكنك عرض <title> و<meta> و<link> في أي مكان من المكوّن، فتنقلها React إلى <head>. يستطيع مكوّن الصفحة ضبط عنوانه الخاص دون مكتبة مثل react-helmet.
ليس للمعاينة تبويب متصفح تعرضه، لذا يسجّل التأثير document.title بدلًا من ذلك. بدّل المقالات فيتبعها العنوان المسجّل.
وحظيت أوراق الأنماط بالمعاملة نفسها: يُدرج <link rel="stylesheet" href="..." precedence="default" /> داخل مكوّن في الرأس مرة واحدة، بترتيب الأولوية، وتنتظره React قبل عرض المحتوى الذي يحتاجه. ووسم <script async src="..."> الذي تعرضه عدة مكوّنات لا يُحمَّل إلا مرة واحدة. وتصدّر react-dom أيضًا preload وpreinit وpreconnect وprefetchDNS لتلميحات الموارد.
Activity وuseEffectEvent (React 19.2)
يخفي <Activity mode="hidden"> أبناءه دون رمي حالتهم. تخفي React الـ DOM، وتشغّل دوال تنظيف التأثيرات، وتستعيد كل شيء عندما يصبح الوضع "visible" من جديد. وهو مناسب للتبويبات واللوحات التي تتوقع أن يعود إليها المستخدم.
اكتب ملاحظة، وبدّل إلى About ثم عد. ما زال النص موجودًا، وتُظهر وحدة التحكم أن التأثير نُظّف أثناء الإخفاء. استبدل مغلّف <Activity> بـ {tab === 'notes' && <Notes />} فتضيع الملاحظة مع كل تبديل.
يُخرج useEffectEvent دالة من اعتماديات التأثير. ترى الدالة دائمًا أحدث props وحالة، لكن تغييرها لا يعيد تشغيل التأثير:
function ChatRoom({ roomId, theme }) {
const onConnected = useEffectEvent(() => {
showNotification('Connected!', theme);
});
useEffect(() => {
const connection = createConnection(roomId);
connection.on('connected', () => onConnected());
connection.connect();
return () => connection.disconnect();
}, [roomId]); // theme is not a dependency
}
وأضافت 19.2 أيضًا cacheSignal لمكوّنات الخادم (تخبرك متى لم تعد نتيجة cache() مطلوبة) ومسارات الأداء (Performance Tracks) في لوحة الأداء في Chrome DevTools. وأضافت React 19.1 الدالة captureOwnerStack، وهي دالة للتطوير فقط تُرجع المكوّنات التي عرضت المكوّن الحالي.
مكوّنات الخادم ودوال الخادم
مكوّنات الخادم مكوّنات تعمل مسبقًا على الخادم (أو وقت البناء) وترسل مخرجاتها إلى المتصفح. يمكن أن تكون async وتقرأ قاعدة بيانات مباشرة، ولا يُرسل كودها إلى العميل أبدًا. ودوال الخادم (التي سُميت أولًا Server Actions) دوال غير متزامنة معلّمة بـ 'use server' يستطيع مكوّن العميل استدعاءها كدالة عادية. ويحتاج كلاهما إلى إطار عمل بأداة تجميع تدعمهما، مثل App Router في Next.js، فلا يمكن تشغيلهما في هذا المحرر.
// A Server Component: async, runs on the server only
export default async function Notes() {
const notes = await db.notes.findMany();
return notes.map((note) => <Note key={note.id} note={note} />);
}
// A Server Function, usable as a form action
async function createNote(formData) {
'use server';
await db.notes.create({ text: formData.get('text') });
}
الواجهات المحذوفة والمتغيرة
حذفت React 19 واجهات كانت مُهملة منذ سنوات:
| المحذوف | استخدم بدلًا منه |
|---|---|
ReactDOM.render وReactDOM.hydrate | createRoot وhydrateRoot من react-dom/client |
unmountComponentAtNode | root.unmount() |
findDOMNode | مرجع على عنصر DOM |
مراجع النصوص (ref="input") | useRef أو دالة مرجع |
السياق القديم (contextTypes وgetChildContext) | createContext مع static contextType أو use |
فحوص propTypes (تُتجاهل الآن بصمت) | TypeScript، أو فحوصك الخاصة |
defaultProps على مكوّنات الدوال | القيم الافتراضية للمعاملات |
react-dom/test-utils | act من react؛ وReact Testing Library لما تبقى |
react-test-renderer/shallow | الحزمة react-shallow-renderer |
React.createFactory | JSX |
تحتفظ مكوّنات الأصناف بـ defaultProps. وتُبلَّغ الأخطاء أيضًا بشكل مختلف: الأخطاء التي تلتقطها حدود الأخطاء تُسجَّل بـ console.error مرة واحدة، والأخطاء غير الملتقطة تذهب إلى window.reportError، ويقبل createRoot الخيارين onCaughtError وonUncaughtError لتبلّغ عنها بنفسك.
الترقية إلى React 19
رقّ إلى React 18.3 أولًا. فهي مطابقة لـ 18.2 لكنها تحذّر من الواجهات المُهملة والتغييرات الأخرى التي تحتاجها React 19، فتستطيع إصلاحها والتطبيق ما زال يعمل. وتتطلب React 19 أيضًا تحويل JSX الحديث، الذي يستخدمه Vite وكل إطار عمل حالي أصلًا. ثم ثبّت React 19:
npm install react@^19 react-dom@^19
npm install --save-dev @types/react@^19 @types/react-dom@^19
يشير دليل الترقية الرسمي إلى أدوات تعديل آلي (codemods) للتغييرات الآلية. الأولى تغطي مراجع النصوص واستيرادات act وReactDOM.render؛ والثانية تحدّث كود TypeScript للأنواع الجديدة:
npx codemod@latest react/19/migration-recipe
npx types-react-codemod@latest preset-19 ./src
بعد الترقية، لا شيء يجبرك على تبنّي الإجراءات أو الخطافات الجديدة. تظل المكوّنات والخطافات ومكوّنات الأصناف الموجودة تعمل؛ ويمكنك نقل النماذج إلى <form action> واحدًا تلو الآخر.
الأسئلة الشائعة
متى صدرت React 19؟
أصبحت React 19 مستقرة في ديسمبر 2024. وتلتها React 19.1 في مارس 2025 وReact 19.2 في أكتوبر 2025.
ما أكبر التغييرات في React 19؟
الإجراءات (دوال غير متزامنة تتولى حالة الانتظار والأخطاء والنماذج نيابة عنك)، والخطافات useActionState وuseOptimistic وuse، وref كـ prop عادية، و<Context> كمزوّد، ووسوم <title> و<meta> التي تنتقل إلى رأس المستند. وأصبحت مكوّنات الخادم مستقرة لأطر العمل.
هل أُهمل forwardRef في React 19؟
صار بإمكان مكوّنات الدوال أن تأخذ ref كـ prop عادية، فلا يحتاج الكود الجديد إلى forwardRef. لكنه ما زال يعمل، وقد قال فريق React إنه سيُهمل في إصدار قادم.
هل تكسر React 19 تطبيقي المكتوب بـ React 18؟
في الغالب عبر الواجهات التي حُذفت: ReactDOM.render وfindDOMNode ومراجع النصوص والسياق القديم وpropTypes وdefaultProps على مكوّنات الدوال. وتتطلب React 19 أيضًا تحويل JSX الحديث. رقّ إلى React 18.3 أولًا، وأصلح تحذيرات الإهمال فيها، ثم شغّل أدوات التعديل الآلي (codemods) الخاصة بـ React 19.
هل أحتاج إلى Next.js لاستخدام React 19؟
لا. الإجراءات والخطافات الجديدة وref كـ prop والبيانات الوصفية تعمل كلها في تطبيق عميل عادي مبني بـ Vite. أما مكوّنات الخادم ودوال الخادم فتحتاج إلى إطار عمل يدعمها، مثل Next.js.