React / Events төрөлжүүлэх

Events төрөлжүүлэх

React апп-д хэрэглэгч товч дарах, текст бичих, маягт илгээх зэрэг үйлдлүүд хийдэг. Эдгээр үйл явдал (event) бүрт TypeScript тусгай төрл өгдөг. Зөв төрлийг мэдвэл event.target.value гэж бичихэд TypeScript туслах болно — буруу бичвэл шууд анхааруулна.

Mouse events

Хамгийн түгээмэл event — товч дарах:

tsx
import { MouseEvent } from "react";

function ActionButtons() {
  // MouseEvent<T> — T нь event-г ажиллуулсан элементийн төрөл
  const handleClick = (event: MouseEvent<HTMLButtonElement>) => {
    console.log("Дарсан байрлал:", event.clientX, event.clientY);
    event.preventDefault();
  };

  const handleDivClick = (event: MouseEvent<HTMLDivElement>) => {
    console.log("Div дарагдлаа");
  };

  return (
    <div onClick={handleDivClick}>
      <button onClick={handleClick}>Товч</button>
    </div>
  );
}

Олонхи тохиолдолд event параметрыг JSX-д шууд бичдэг тул TypeScript өөрөө таньдаг:

tsx
// Inline бичихэд TypeScript автоматаар таньдаг — маш тохиромжтой
<button onClick={(e) => console.log(e.currentTarget.textContent)}>Товч</button>

Input болон Change events

Form элементтэй ажиллахад хамгийн их хэрэглэгддэг event:

tsx
import { ChangeEvent } from "react";
import { useState } from "react";

function LoginForm() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  // ChangeEvent<HTMLInputElement> — input элементийн өөрчлөлт
  const handleEmailChange = (event: ChangeEvent<HTMLInputElement>) => {
    setEmail(event.target.value);
  };

  // ChangeEvent<HTMLTextAreaElement> — textarea элементийн өөрчлөлт
  const handleNoteChange = (event: ChangeEvent<HTMLTextAreaElement>) => {
    console.log("Тэмдэглэл:", event.target.value);
  };

  // ChangeEvent<HTMLSelectElement> — select элементийн өөрчлөлт
  const handleCourseSelect = (event: ChangeEvent<HTMLSelectElement>) => {
    console.log("Сонгосон курс:", event.target.value);
  };

  return (
    <form>
      <input
        type="email"
        value={email}
        onChange={handleEmailChange}
        placeholder="И-мэйл"
      />
      <input
        type="password"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
        placeholder="Нууц үг"
      />
      <textarea onChange={handleNoteChange} placeholder="Тэмдэглэл" />
      <select onChange={handleCourseSelect}>
        <option value="javascript">JavaScript</option>
        <option value="react">React</option>
      </select>
    </form>
  );
}

Form submit event

Маягт илгээхэд FormEvent ашиглана:

tsx
import { FormEvent, useState } from "react";

interface RegisterData {
  username: string;
  email: string;
  password: string;
}

function RegisterForm() {
  const [data, setData] = useState<RegisterData>({
    username: "",
    email: "",
    password: "",
  });
  const [isLoading, setIsLoading] = useState(false);

  const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {
    // Хуудас дахин ачаалахгүй байхын тулд заавал бичих
    event.preventDefault();

    setIsLoading(true);
    try {
      // Суурьт илгээх кодоо энд бичнэ
      await fetch("/api/register", {
        method: "POST",
        body: JSON.stringify(data),
      });
    } finally {
      setIsLoading(false);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        value={data.username}
        onChange={(e) =>
          setData((prev) => ({ ...prev, username: e.target.value }))
        }
        placeholder="Нэвтрэх нэр"
      />
      <input
        type="email"
        value={data.email}
        onChange={(e) =>
          setData((prev) => ({ ...prev, email: e.target.value }))
        }
        placeholder="И-мэйл"
      />
      <button type="submit" disabled={isLoading}>
        {isLoading ? "Бүртгэж байна..." : "Бүртгүүлэх"}
      </button>
    </form>
  );
}

Keyboard events

Гар дарах үйл явдлыг боловсруулахад KeyboardEvent ашиглана:

tsx
import { KeyboardEvent } from "react";

function SearchInput() {
  const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
    if (event.key === "Enter") {
      console.log("Хайлт:", event.currentTarget.value);
    }

    if (event.key === "Escape") {
      event.currentTarget.blur();
    }

    // Ctrl + K товчлол
    if (event.ctrlKey && event.key === "k") {
      event.preventDefault();
      console.log("Хайлтын цонх нээлаа");
    }
  };

  return (
    <input
      type="search"
      onKeyDown={handleKeyDown}
      placeholder="Хайх... (Enter дарна уу)"
    />
  );
}

Event-ын төрлүүдийг цээжилхийн хэрэггүй — onChange, onClick гэж бичих үед редактор ChangeEvent<HTMLInputElement> гэж санал болгоно. Тухай бүртээ редакторын санал болголтыг ашиглаарай — TypeScript танд заасан дасгалаасаа илүү ихийг сурах болно.

Дараагийн хичээлд:

Кодын алдааг олохын тулд автомат тест бичих — Vitest ашиглан анхны тестийг бичнэ. Тест бичих нь кодын чанарыг нэмэгдүүлэх хамгийн үр дүнтэй аргуудын нэг.