[TS] ์๋ฆฌ๋จผํธ์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ ์ธํฐํ์ด์ค/ํ์ ์ฌ์ฉํ๊ธฐ
HTMLAttributes
checkbox
ํ์
์ <input>
์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ Toggle
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณด์. <input>
์๋ฆฌ๋จผํธ๋ autoFocus
, required
, readOnly
๋ฑ์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ง๋ค.
๋ง์ฝ <input>
์๋ฆฌ๋จผํธ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ ์ ์๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ Toggle ์ปดํฌ๋ํธ์ props๋ก ๋๊ธฐ๊ณ ์ถ๋ค๋ฉด? ๋ชจ๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํด์ผ ํ ๊น?
์ด๋ InputHTMLAttributes
ํ์
์ ์ฌ์ฉํ๋ฉด ๋๋ค. ๊ทธ๋ผ ๊ฐ ์ดํธ๋ฆฌ๋ทฐํธ์ prop ํ์
์ ์ผ์ผ์ด ์ ์ํ์ง ์์๋ ๋๋ค. ์ ๋ค๋ฆญ T
๋ onChange
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์๋ฆฌ๋จผํธ ํ์
์ด ๋ค์ด๊ฐ๋ฏ๋ก HTMLInputElement
๊ฐ์ ํ์
์ ๋๊ธฐ๋ฉด ๋๋ค.
// InputHTMLAttributes ๊ตฌ์กฐ | node_modules/@types/react/index.d.ts
interface InputHTMLAttributes<T> extends HTMLAttributes<T> {
accept?: string | undefined;
alt?: string | undefined;
autoComplete?: string | undefined;
// ...
onChange?: ChangeEventHandler<T> | undefined;
}
type ChangeEventHandler<T = Element> = EventHandler<ChangeEvent<T>>;
๐ก InputHTMLAttributes
, InputAttributes
๋ฑ์ @types/react ํจํค์ง์์ ์ ๊ณตํ๋ ํ์
์ด๋ค
์ฐธ๊ณ ๋ก id
, className
, draggable
๊ฐ์ HTML ์์์ ๊ณตํต์ ์ธ ์ดํธ๋ฆฌ๋ทฐํธ๋ HTMLAttributes
ํ์
์์ ์์ ๋ฐ์ ์ฌ์ฉํ๊ณ ์๋ค. DOMAttributes
์ ์ ๋ค๋ฆญ T
๋ ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฆฌ๋จผํธ ํ์
์ ๋ฐ๋๋ค.
// HTMLAttributes ๊ตฌ์กฐ | node_modules/@types/react/index.d.ts
interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
// React-specific Attributes
defaultChecked?: boolean | undefined;
defaultValue?: string | number | ReadonlyArray<string> | undefined;
// ...
// Standard HTML Attributes
accessKey?: string | undefined;
className?: string | undefined;
// ...
}
interface DOMAttributes<T> {
// ...
onCopy?: ClipboardEventHandler<T> | undefined;
// ...
}
ํ์ฉ ์์ โก๏ธ
<input>
์๋ฆฌ๋จผํธ์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ๋ InputHTMLAttributes<HTMLInputElement>
ํ์
์ ํตํด ์์๋ฐ๊ณ , label
color
๊ฐ์ ์ปดํฌ๋ํธ ์์ค์์ ํ์ํ prop๋ง ToggleProps
์ธํฐํ์ด์ค์ ์ถ๊ฐํด์ ์ฌ์ฉํ๋ค.
ํํธ size
์์ฑ์ <input>
์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ(number | undefined
)์ง๋ง ํ๋ก์ ํธ์์ ์๊ตฌํ๋ ์ฌ์ด์ฆ ํ์
TSize
์ ๋ง์ถฐ์ผํ๋ ์ํฉ์ด๋ค. ๋ฐ๋ผ์ Omit ์ ํธ๋ฆฌํฐ ํ์
์ผ๋ก InputHTMLAttributes
์ size
์์ฑ์ ์ ์ธํ๊ณ ToggleProps
์ธํฐํ์ด์ค์ TSize
ํ์
์ ์ถ๊ฐํ๋ค.
// Toggle.tsx
import React, { InputHTMLAttributes } from "react";
// TColor : primary | error | background | ...
// TSize : base | lg | md | ...
interface ToggleProps
extends Omit<InputHTMLAttributes<HTMLInputElement>, "size"> {
className?: string;
label?: string;
color?: TColor;
size?: TSize; // size๋ <input>์ ๊ธฐ๋ณธ ์ดํธ๋ฆฌ๋ทฐํธ์ง๋ง ํ๋ก์ ํธ์์ ์๊ตฌํ๋ ํ์
์ผ๋ก ๋์ฒด
}
export default function Toggle({
className,
label,
color,
size,
...inputProps
}: ToggleProps) {
// ... ์ปดํฌ๋ํธ ๋ณธ๋ฌธ ๋ฐ return๋ฌธ ์์ธ ์๋ต
return <input type="checkbox" {...inputProps} />;
}
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[React] ์บ๋ก์ (Carousel) ์๋ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ
[React] ์บ๋ก์ (Carousel) ์๋ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ
2024.05.13 -
[React] ๋ ธ๋์ ํธ๋ฆฌ ์์น๋ฅผ ๋ํ๋ด๋ useId ํ
[React] ๋ ธ๋์ ํธ๋ฆฌ ์์น๋ฅผ ๋ํ๋ด๋ useId ํ
2024.05.13 -
[JS] ์ JSX ์์์ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์๊น? ํํ์๊ณผ ๋ฌธ ์ฐจ์ด์
[JS] ์ JSX ์์์ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์๊น? ํํ์๊ณผ ๋ฌธ ์ฐจ์ด์
2024.05.12 -
[TS] useQuery, useMutation์ ์ ๋ค๋ฆญ ํ์ ์ดํด๋ณด๊ธฐ / Base Query ํ ๋ง๋ค๊ธฐ
[TS] useQuery, useMutation์ ์ ๋ค๋ฆญ ํ์ ์ดํด๋ณด๊ธฐ / Base Query ํ ๋ง๋ค๊ธฐ
2024.05.12