λ€μ΄λ°
μ»΄ν¬λνΈλͺ
μ νμ€μΉΌ μΌμ΄μ€ ex) Header, Button
λ³μλͺ
, ν¨μλͺ
μ μΉ΄λ© μΌμ΄μ€ ex) isLogin
νμ
νμ€μΉΌ μΌμ΄μ€λ‘ Prefix μμ΄ μ μνλ€.
Propsλ ν΄λΉ νμ
μ΄ μ¬μ©λλ νμΌ λ΄λΆμ μ μνλ€.
interface Props { name: String, password: String } const Login = ({ name, password }: Props) => { return (); }
νΈλ€λ¬ ν¨μ
Prefixλ‘
handle
μ μ¬μ©νλ€.const handleChange = () => {}
νΈλ€λ¬ ν¨μμ νμ
μ
React.ChangeEventHandler<HTMLInputElement>
μ κ°μ ννλ‘ ν΅μΌνλ€.onChange: React.ChangeEventHandler<HTMLInputElement>
Prettier
μ½λ ν¬λ§·ν
μ μν Prettier μ€μ μ μλμ κ°λ€.
{ "printWidth": 120, "tabWidth": 2, "singleQuote": true, "semi": true, "bracketSpacing": true, "bracketSameLine": false, "jsxSingleQuote": true, "trailingComma": "all", "useTabs": false, "singleAttributePerLine": true, "endOfLine": "auto" }
Lint
μ½λ λ¦°ν
μ μν ESLint μ€μ μ μλμ κ°λ€.
λ§μ½ μλ‘μ΄ λ£°μ΄ νμνκ±°λ κΈ°μ‘΄ λ£° μ€μμ μ¬μ©νμ§ μμμΌ ν λ£°μ΄ μλ κ²½μ°
1. μΆκ°νκ±°λ μμ ν΄μΌ νλ μ΄μ λ₯Ό λ
Έμ
μ λ¬Έμλ‘ μ 리νλ€.
2. μ 리ν λ΄μ©μ λ°νμΌλ‘ νμλ€κ³Ό μμ ν κ²°μ νλ€.
{ "root": true, "parser": "@typescript-eslint/parser", "parserOptions": { "tsConfigRootDir": "./", "project": "./tsconfig.json" }, "plugins": ["@typescript-eslint"], "extends": [ "next/core-web-vitals", "airbnb", "airbnb-typescript", "plugin:react/jsx-runtime", "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking", "prettier" ] }
ν¨μ μ μ
function ν€μλ λμ νμ΄ν ν¨μλ₯Ό μ¬μ©ν ν¨μ ννμμΌλ‘ ν¨μλ₯Ό μ μνλ€.
const handleSubmit = () => {}; const ComponentName = () => { return <div>hello</div>; }; export default ComponentName;
Container? Wrapper?
λ¨μΌ μμλ₯Ό κ°μΈμΌ νλ€λ©΄
Wrapper
<Wrapper> <span>hi</span> </Wrapper>
2κ° μ΄μμ μμλ₯Ό κ°μΈμΌ νλ€λ©΄
Container
<Container> <img src='/img/good.png' /> <span>hi</span> </Container>