🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

الرد على أسئلة المقابلة 2026: الخطافات ومكونات الخادم والأداء

⏱️3 min read  ·  628 words

React interview questions in 2026 cover hooks, state management, performance optimization, React 19’s new features, and TypeScript patterns. This guide covers the most commonly asked React questions at both junior and senior levels.

أسئلة التفاعل الأساسية

1. ما هو DOM الافتراضي وكيف تتم المصالحة؟

DOM الافتراضي هو تمثيل جافا سكريبت خفيف الوزن لـ DOM الحقيقي. عندما تتغير الدولة:

  1. تقوم React بإنشاء شجرة DOM افتراضية جديدة
  2. تقارن خوارزمية Diffing DOM الافتراضية الجديدة والسابقة
  3. يتم تحديث العقد التي تم تغييرها فقط في DOM الحقيقي
  4. هذا التجميع للتحديثات يجعل React ذو أداء عالي

يستخدم React 18+ العرض المتزامن — يمكنه إيقاف العرض مؤقتًا ومقاطعته واستئنافه، مع إعطاء الأولوية للتحديثات العاجلة.

2. شرح useEffect ومزالقه الشائعة

import { useEffect, useState } from 'react';

function UserProfile({ userId }: { userId: number }) {
  const [user, setUser] = useState<User | null>(null);

  // Correct: cleanup function + proper dependencies
  useEffect(() => {
    let cancelled = false;  // prevent stale closure

    async function fetchUser() {
      const data = await api.getUser(userId);
      if (!cancelled) setUser(data);  // only update if still mounted
    }

    fetchUser();

    return () => { cancelled = true; };  // cleanup
  }, [userId]);  // dependency array

  // PITFALL 1: missing dependency
  // useEffect(() => { fetchUser(userId); }, []);
  // This won't re-run when userId changes!

  // PITFALL 2: object/array in deps (new reference every render)
  // useEffect(() => { ... }, [options]);  // infinite loop if options = {}
  // Fix: useMemo(() => options, [dep1, dep2])

  // PITFALL 3: no cleanup for subscriptions
  useEffect(() => {
    const sub = websocket.subscribe(userId, setUser);
    return () => sub.unsubscribe();  // ALWAYS cleanup subscriptions!
  }, [userId]);

  return user ? <Profile user={user} /> : <Loading />;
}

3. متى يجب عليك استخدام useMemo وuseCallback؟

// useMemo — memoize expensive computed value
const filteredUsers = useMemo(
  () => users.filter(u => u.active && u.role === selectedRole),
  [users, selectedRole]  // recompute only when these change
);

// useCallback — memoize function reference
const handleDelete = useCallback(
  (userId: number) => {
    setUsers(prev => prev.filter(u => u.id !== userId));
  },
  []  // no deps — stable reference
);

// Use useMemo when:
// - Expensive computation (sorting, filtering large arrays)
// - Object/array passed to children with React.memo
// - Dependency for other hooks

// Use useCallback when:
// - Passing to child component wrapped in React.memo
// - As dependency in useEffect to prevent re-runs

// DON'T overuse — memoization has overhead!
// Bad: const value = useMemo(() => a + b, [a, b]);  // trivial, skip it

4. ما هو React.memo ومتى يتم استخدامه؟

// React.memo — prevent re-render if props haven't changed
const ExpensiveList = React.memo(function ExpensiveList({ items, onItemClick }: Props) {
  console.log('ExpensiveList rendered');
  return (
    <ul>
      {items.map(item => (
        <li key={item.id} onClick={() => onItemClick(item.id)}>
          {item.name}
        </li>
      ))}
    </ul>
  );
});

// Parent using it correctly
function Parent() {
  const [count, setCount] = useState(0);
  const [items] = useState(bigItemList);

  // useCallback ensures stable reference (required for memo to work)
  const handleClick = useCallback((id: number) => {
    console.log('clicked', id);
  }, []);

  return (
    <div>
      <button onClick={() => setCount(c => c + 1)}>Count: {count}</button>
      {/* ExpensiveList won't re-render when count changes */}
      <ExpensiveList items={items} onItemClick={handleClick} />
    </div>
  );
}

إدارة الدولة

5. متى يجب عليك استخدام Redux vs Zustand vs context API؟

أداة استخدم متى تجنب متى
واجهة برمجة تطبيقات السياق السمة، واللغة، وحالة المصادقة (تحديثات نادرة) التحديثات المتكررة (تؤدي إلى إعادة العرض)
زوستاند تحتاج معظم التطبيقات إلى حالة عالمية احتياجات مصادر الأحداث معقدة للغاية
مجموعة أدوات الإعادة فرق كبيرة، حالة معقدة، تصحيح أخطاء السفر عبر الزمن تطبيقات بسيطة (مبالغة)
استعلام TanStack حالة الخادم (دائمًا) ليس لحالة واجهة المستخدم

الرد على 19 سؤال

6. ما هي مكونات الخادم وكيف تختلف عن مكونات العميل؟

// Server Component (default in Next.js App Router)
// - Runs only on server, never on client
// - Can access databases, file system directly
// - Zero JS sent to client (except HTML)
// - Cannot use state, effects, event handlers

async function ProductList() {  // no 'use client'
  const products = await db.products.findMany();  // direct DB access!
  return (
    <ul>
      {products.map(p => <ProductCard key={p.id} product={p} />)}
    </ul>
  );
}

// Client Component (must add 'use client')
// - Runs on both server (initial HTML) and client (hydration)
// - Can use useState, useEffect, event handlers
// - Receives props from Server Components

'use client';
function AddToCart({ productId }: { productId: number }) {
  const [added, setAdded] = useState(false);

  return (
    <button onClick={() => {
      addToCart(productId);
      setAdded(true);
    }}>
      {added ? 'Added!' : 'Add to Cart'}
    </button>
  );
}

7. ما هي ميزات React 19 الجديدة؟

  • إجراءات الخادم– وظائف غير متزامنة تعمل على الخادم، ويمكن الاتصال بها من العميل
  • استخدام () هوك– قراءة الوعود والسياق في العرض (يستبدل بعض أنماط useEffect)
  • إجراءات النموذج– التعامل مع النموذج الأصلي مع وظائف الخادم
  • تحديثات متفائلة— useOptimistic() للحصول على تعليقات فورية على واجهة المستخدم
  • البيانات التعريفية للوثيقة– العنوان والعلامات الوصفية في المكونات مباشرة
  • تحميل الأصول– التكامل المعلق للصور وCSS

8. كيف تتعامل مع الأخطاء في React؟

// Error Boundary (class component, required for now)
class ErrorBoundary extends React.Component<
  { fallback: React.ReactNode; children: React.ReactNode },
  { hasError: boolean }
> {
  state = { hasError: false };

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  componentDidCatch(error: Error, info: React.ErrorInfo) {
    logErrorToService(error, info);
  }

  render() {
    if (this.state.hasError) return this.props.fallback;
    return this.props.children;
  }
}

// Usage
<ErrorBoundary fallback={<ErrorPage />}>
  <UserProfile />
</ErrorBoundary>

// React 19: useErrorBoundary hook coming (use 'react-error-boundary' lib now)

إعداد مقابلة React: فهم الخطافات بعمق (خاصة تبعيات useEffect)، ومعرفة متى يجب التحسين (React.memo + useCallback/useMemo)، وشرح تقسيم مكون الخادم/العميل، ومعرفة خيارات إدارة الحالة الحالية. أنشئ عددًا قليلًا من تطبيقات الإنتاج لفهم هذه المفاهيم بشكل تجريبي، وليس نظريًا فقط.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা