본문 바로가기
React

react.js 입문

by 부웡 2025. 5. 7.

- extensions > exlint : 잘못된 문법 검사

rules: {
    'react/jsx-no-target-blank': 'off',
    'react-refresh/only-export-components': [
      'warn',
      { allowConstantExport: true },
    ],
    'no-unused-vars':"off", //추가
    'react/prop-types':"off", //추가
  },

.eslintrc.cjs


[react component] 리액트 컴포넌트
- 컴포넌트 함수를 만들때에 함수 이름 첫글자는 대문자여야함!


  • JSX : 확장된 자바스크립트의 문법을 말함
    - javascript와 html을 혼용해서 사용
  • JSX 주의사항
    1. 중괄호 내부에는 자바스크립트 표현식만 넣을 수 있다.
    2. 숫자, 문자열, 배열 값만 렌더링 된다.
    3. 모든 태그는 닫혀있어야한다.
    * 단일 태그는 셀프 클로징 필요!! ex) <img />
    4. 최상위 태그는 반드시 하나여야만 한다.
    * 마땅한 태그가 없다면 <></> 빈 태그로 감싸줘도 된다.
const Main = () => {
  const number = 10;
  const obj = { a: 1 };

  return (
    <main>
      <h1>Main</h1>
      <h2>{number % 2 === 0 ? "짝수" : "홀수"}</h2>
      {10}
      {number}
      {[1, 2, 3]}
      {undefined} //화면에 표현되지 않음.
      {null} //화면에 표현되지 않음.
      {obj.a} //객체 값만 반환 가능
    </main>
  );
};

export default Main;
  • JSX에서 스타일을 입히는 방법?
  1.  태그 인라인 스타일 사용(속성은 카멜케이스로 적용!)
    - backgroundColor
    - borderBottom
  2. 별도의 css파일로 작성
    - html에서는 class=""로 사용했으나 jsx에서는 className=""으로 적용해야한다.

[props]

  • props로 데이터 전달하기
    - 부모 컴포넌트에서 자식으로 props 전달, 반대로 자식에서 부모로는 전달 불가!
  • props 내부 값을 조회할 때 props.값 형태로 입력
    -> 비구조화 할당 문법을 사용하면 조금 더 간결한 코드 작성 가능
    * 비구조화 할당은 객체에서 값을 추출해서 새로운 상수로 선언해 주는 것!
function Hello(props) {
  return <div style={{ color: props.color }}>안녕하세요 {props.name}</div>
}
function Hello({ color, name }) {
  return <div style={{ color }}>안녕하세요 {name}</div>
}
  • defaultProps로 기본값 설정
    - 컴포넌트에 props를 지정하지 않았을 때 기본적으로 사용할 값 설정
import React from 'react';
import Hello from './Hello';

function App() {
  return (
    <>
      <Hello name="react" color="red"/>
      <Hello color="pink"/>
    </>
  );
}

export default App;
import React from 'react';

function Hello({ color, name }) {
  return <div style={{ color }}>안녕하세요 {name}</div>
}

Hello.defaultProps = {
  name: '이름없음'
}

export default Hello;

 

  • props.children
    - 컴포넌트 태그 사이에 넣은 값을 조회하고 싶을 떄 사용

[이벤트 처리하기]

  • 이벤트 이름은 카멜표기법
  • 이벤트에 함수 형태의 값을 전달
    - 화살표 함수 문법을 사용하거나 렌더링 부분 외부에 미리 만들어서 전달
  • DOM 요소에만 이벤트를 설정할 수 있음
    - 직접 만든 컴포넌트에는 이벤트를 자체적으로 설정 불가.
const Button = ({ text, color, children }) => {
  //이벤트 객체
  const onClickButton = (e) => {
    console.log(e);
    console.log(text);
  };

  return (
    <button
      onClick={onClickButton}
      // onMouseEnter={onClickButton}
      style={{ color: color }}
    >
      {text} - {color.toUpperCase()}
      {children}
    </button>
  );
};

Button.defaultProps = {
  color: "black",
};

export default Button;

[State로 상태관리하기]

  • State : 현재 가지고 있는 형태나 모양을 정의, 변화할 수 있는 동적인 값
  • state를 갖는 react 컴포넌트 : state의 값에 따라 렌더링되는 결과가 달라진다.
import "./App.css";
import { useState } from "react";

function App() {
  const [count, setCount] = useState(0);
  const [light, setLight] = useState("OFF");

  return (
    <>
      <div>
        <h1>{light}</h1>
        <button
          onClick={() => {
            setLight(light === "ON" ? "OFF" : "ON");
          }}
        >
          {light === "ON" ? "끄기" : "켜기"}
        </button>
      </div>
      <div>
        <h1>{count}</h1>
        <button
          onClick={() => {
            setCount(count + 1);
          }}
        >
          +
        </button>
      </div>
    </>
  );
}

export default App;

[State와 Props]

  • state를 props로 전달하기
    const [number, setNumber] = useState(0);
    -> number는 현재상태, setNumber는 setter 함수
    * setter함수는 파라미터로 전달받은 값을 최신 상태로 설정

[state로 사용자 입력 관리하기]

import { useState } from "react";
//회원가입 폼
// 1. 이름
// 2. 생년월일
// 3. 국적
// 4. 자기소개
const Register = () => {
  const [name, setName] = useState("이름");
  const [birth, setBirth] = useState("");
  const [country, setCountry] = useState("");
  const [bio, setBio] = useState("");

  const onChangeName = (e) => {
    setName(e.target.value);
  };

  const onChangeBirth = (e) => {
    setBirth(e.target.value);
  };

  const onChangeCountry = (e) => {
    setCountry(e.target.value);
  };

  const onChangeBio = (e) => {
    setName(e.target.value);
  };

  return (
    <div>
      <div>
        <input value={name} onChange={onChangeName} placeholder="이름" />
      </div>

      <div>
        <input value={birth} onChange={onChangeBirth} type="date" />
        {birth}
      </div>

      <div>
        <select value={country} onChange={onChangeCountry}>
          <option value="kr">한국</option>
          <option value="us">미국</option>
          <option value="uk">영국</option>
        </select>
      </div>

      <div>
        <textarea value={bio} onChange={onChangeBio} />
      </div>
    </div>
  );
};

export default Register;

[state로 사용자 입력 관리하기2]
-> 비슷한 여러개의 state가 있을때는 하나의 객체값으로 묶어서 하나의 state로 통합관리

import { useState } from "react";
// 간단한 회원가입 폼
// 1. 이름
// 2. 생년월일
// 3. 국적
// 4. 자기소개

const Register = () => {
  const [input, setInput] = useState({
    name: "",
    gender: "",
    bio: "",
  });

  const onChange = (e) => {
    console.log(e.target.name + " : " + e.target.value);
    setInput({
      ...input,
      [e.target.name]: e.target.value,
    });
  };

  return (
    <div>
      <div>
        <input
          name="name"
          value={input.name}
          onChange={onChange}
          placeholder={"이름"}
        />
      </div>

      <div>
        <input
          name="birth"
          value={input.birth}
          onChange={onChange}
          type="date"
        />
      </div>

      <div>
        <select
          name="country"
          value={input.country}
          onChange={onChange}
        >
          <option value=""></option>
          <option value="kr">한국</option>
          <option value="us">미국</option>
          <option value="uk">영국</option>
        </select>
      </div>

      <div>
        <textarea
          name="bio"
          value={input.bio}
          onChange={onChange}
        />
      </div>
    </div>
  );
};

export default Register;

[useRef로 컴포넌트의 변수 생성하기]

  • useRef : Reference객체를 생성
    - 컴포넌트 내부의 변수로 활용 가능
    * 어떤 경우에도 리렌더링을 유발하지 않음
  • useState : State를 생성
    - 컴포넌트 내부의 변수로 활용 가능
    * 값이 변경되면 컴포넌트 린렌더링!!

[React Hooks]
- 클래스 컴포넌트의 기능을 함수 컴포넌트에서도 이용할 수 있도록

  • useState, useRef도 React Hooks
    - useState : State 기능을 낚아채오는 Hook
    - useRef : Reference 기능을 낚아채오는 Hook
  • React Hook은?
    - 이름 앞에 use가 붙음
    - 함수 컴포넌트 내부에서만 호출
    - 조건문, 반복문 내부에서는 호출 불가
    - 나만의 hook도 제작 가능(Custom Hook)
import useInput from "../hooks/useInput";

// 3가지 hook 관련된 팁
// 1. 함수 컴포넌트, 커스텀 훅 내부에서만 호출 가능
// 2. 조건부로 호출될 수는 없다
// 3. 나만의 훅(custom Hook)을 직접 만들 수 있다

const HookExam = () => {
  const [input, onChange] = useInput();
  const [input2, onChange2] = useInput();

  return (
    <div>
      <input value={input} onChange={onChange} />
      <input value={input2} onChange={onChange2} />
    </div>
  );
};

export default HookExam;

HookExam.jsx

import useInput from "../hooks/useInput";

// 3가지 hook 관련된 팁
// 1. 함수 컴포넌트, 커스텀 훅 내부에서만 호출 가능
// 2. 조건부로 호출될 수는 없다
// 3. 나만의 훅(custom Hook)을 직접 만들 수 있다

const HookExam = () => {
  const [input, onChange] = useInput();
  const [input2, onChange2] = useInput();

  return (
    <div>
      <input value={input} onChange={onChange} />
      <input value={input2} onChange={onChange2} />
    </div>
  );
};

export default HookExam;

useInput.jsx

 

 

* 출처 : 한입 크기로 잘라먹는 리액트

'React' 카테고리의 다른 글

react.js 개론  (0) 2025.05.07

댓글