0Pricing
React Academy · درس

تحديد أنواع الأحداث والمراجع في TypeScript

استخدم الأنواع العامة React.ChangeEvent وReact.MouseEvent وRefObject لتفاعلات DOM.

تحديد أنواع الأحداث والمراجع في TypeScript درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

الأحداث الاصطناعية في React

يغلّف React أحداث DOM الأصلية داخل SyntheticEvent. ولكل نوع من الأحداث نوع عام مخصّص، مثل: React.ChangeEvent<HTMLInputElement> وReact.MouseEvent<HTMLButtonElement> وغيرهما.

تحديد نوع onChange

الحدث الأكثر شيوعًا هو onChange في عناصر الإدخال. حدّد نوع معالجه باستخدام React.ChangeEvent<HTMLInputElement>.

function SearchInput() {
  const [value, setValue] = useState('');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setValue(e.target.value);
  };

  return <input value={value} onChange={handleChange} />;
}

تحديد نوع onClick

تستخدم نقرات الأزرار النوع React.MouseEvent<HTMLButtonElement>. ويمكنك الوصول بأمان، مع تحديد الأنواع كاملًا، إلى e.currentTarget وe.preventDefault() وe.stopPropagation().

function DeleteButton({ onDelete }: { onDelete: () => void }) {
  const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
    e.stopPropagation();
    onDelete();
  };
  return <button onClick={handleClick}>Delete</button>;
}

تحديد نوع onSubmit

يستخدم إرسال النموذج النوع React.FormEvent<HTMLFormElement>. استدعِ دائمًا e.preventDefault() لمنع انتقال المتصفح الافتراضي.

function LoginForm() {
  const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    const form = e.currentTarget;
    const email = (form.elements.namedItem('email') as HTMLInputElement).value;
    console.log(email);
  };
  return (
    <form onSubmit={handleSubmit}>
      <input name="email" />
      <button type="submit">Login</button>
    </form>
  );
}

تحديد أنواع أحداث لوحة المفاتيح

استخدم React.KeyboardEvent<HTMLElement> لتحديد نوع معالجات لوحة المفاتيح. ويمكنك الوصول بأمان إلى e.key وe.code وe.ctrlKey.

function CommandInput() {
  const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
    if (e.key === 'Enter' && e.metaKey) {
      submitCommand();
    }
  };
  return <input onKeyDown={handleKeyDown} />;
}

useRef لعناصر DOM

مرّر نوع عنصر HTML كمعامل النوع العام إلى useRef، وابدأه بالقيمة null. عندها يعرف TypeScript أن المرجع يحتوي على ذلك النوع من العناصر.

function AutoFocusInput() {
  const inputRef = useRef<HTMLInputElement>(null);

  useEffect(() => {
    inputRef.current?.focus();
  }, []);

  return <input ref={inputRef} />;
}

المرجع القابل للتغيير مقابل مرجع DOM

عند تخزين قيمة قابلة للتغيير، وليست عقدة DOM، ابدأ useRef بقيمة بدلًا من null. عندها يستنتج TypeScript مرجعًا قابلًا للتغيير من النوع MutableRefObject.

// DOM ref (read-only current)
const divRef = useRef<HTMLDivElement>(null);

// Mutable ref (read-write current)
const countRef = useRef<number>(0);
countRef.current += 1; // ✓ no TypeScript error

تحديد نوع useImperativeHandle

عند إتاحة واجهة برمجية لمرجع من مكوّن فرعي، عرّف واجهة للتعامل معها واستخدمها في كلٍّ من forwardRef وuseImperativeHandle.

interface DialogHandle {
  open: () => void;
  close: () => void;
}

const Dialog = forwardRef<DialogHandle, { title: string }>((props, ref) => {
  useImperativeHandle(ref, () => ({
    open: () => console.log('open'),
    close: () => console.log('close'),
  }));
  return <div>{props.title}</div>;
});

دوال callback للمراجع

تتلقى دالة callback الخاصة بالمرجع عنصر DOM أو القيمة null. حدّد نوعها على النحو (node: HTMLElement | null) => void.

function MeasureDiv() {
  const [height, setHeight] = useState(0);

  const measuredRef = (node: HTMLDivElement | null) => {
    if (node) setHeight(node.getBoundingClientRect().height);
  };

  return <div ref={measuredRef}>Content: {height}px tall</div>;
}

الفرق بين target وcurrentTarget في الأحداث

يمثّل e.target العنصر الذي أطلق الحدث، بينما يمثّل e.currentTarget العنصر المرتبط به المعالج. حوّل نوع e.target عندما تحتاج إلى خصائص محدّدة.

const handleClick = (e: React.MouseEvent<HTMLUListElement>) => {
  const target = e.target as HTMLLIElement;
  console.log(target.dataset.id);
};

نوع معالج الأحداث العام

لكتابة دوال معالجات أحداث قابلة لإعادة الاستخدام، استخدم النوع العام React.EventHandler<Event> أو اكتب توقيع الدالة كاملًا مباشرةً.

type InputChangeHandler = React.ChangeEventHandler<HTMLInputElement>;

const logChange: InputChangeHandler = (e) => {
  console.log(e.target.value); // e is fully typed
};

تحقق سريع

ما نوع TypeScript الذي ينبغي استخدامه لـ useRef الذي يحتوي على HTMLInputElement؟

مراجعة

حدّد أنواع معالجات الأحداث باستخدام الأنواع العامة React.ChangeEvent وReact.MouseEvent وReact.FormEvent. وحدّد أنواع مراجع DOM باستخدام useRef<HTMLElement>(null)، والمراجع القابلة للتغيير باستخدام نوع القيمة. استخدم forwardRef مع واجهة صريحة للتعامل مع واجهات برمجة التطبيقات命 imperative.

الأسئلة الشائعة

هل درس «تحديد أنواع الأحداث والمراجع في TypeScript» مجاني؟

نعم — نص درس «تحديد أنواع الأحداث والمراجع في TypeScript» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «تحديد أنواع الأحداث والمراجع في TypeScript»؟

استخدم الأنواع العامة React.ChangeEvent وReact.MouseEvent وRefObject لتفاعلات DOM. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تحديد أنواع الأحداث والمراجع في TypeScript»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تحديد أنواع الخصائص والقيم المرجعة للمكوّنات
  2. تحديد أنواع الأحداث والمراجع في TypeScript
  3. المكوّنات العامة وأنواع الأدوات
  4. تحديد أنواع Context وCustom Hooks
← العودة إلى React Academy