React

[React #20] Props / 이벤트 핸들러

PEAZH 2024. 3. 6. 11:03
반응형

01. Props

  • 리액트에서는 부모 컴포넌트가 자식 컴포넌트에게 원하는 값을 전달할 수 있음
  • 자식 컴포넌트에서 부모 컴포넌트에게 값을 전달하는 것은 불가능
  • 함수를 호출하면서 인수 전달하는 것과 비슷함
  • Props는 전달된 값을 의미
  • Props를 이용하여 전달하는 값에 따라 각각 다른 UI를 렌더링할 수 있음
  • 문자열, JavaScript값, HTML 요소, React 컴포넌트 전달 가능

 

02. Props로 값 전달해 각각 다른 텍스트 렌더링하기

 

01) 부모 컴포넌트에서 props 값 전달

- 방법 1 : 바로 전달

import './App.css';
import Button from './components/Button';

export default function App() {
  return (
    <>
      <Button text={'메일'} />
      <Button text={'카페'}/>
      <Button text={'블로그'}/>
    </>
  );
}

 

- 방법 2 : 스프레드 연산자 이용

import './App.css';
import Button from './components/Button';

const buttonProps = {
  text: '메일',
  color: 'red',
  a: 1,
  b: 2,
  c: 3,
};

export default function App() {
  return (
    <>
      <Button {...buttonProps} />
    </>
  );
}

 

 

02) 자식 컴포넌트에서 props 값 받기

  • 자식 컴포넌트에게 props를전달하면 값들은 객체로 묶여서 자식 컴포넌트의 매개변수로 제공이 됨

- 방법 1 : 점 표기법

import React from 'react';

function Button(props) {
  console.log(props);
  return <button>{props.text}</button>;
}

export default Button;

 

- 방법 2 : 구조 분해 할당

import React from 'react';

function Button({ text }) {
  return (
    <button>
      {text}
    </button>
  );
}

export default Button;

실행화면

 

 

03) props 기본값 설정하기

  • 전달한 props 값을 받을 때 값이 없으면 오류가 발생할 수 있음
  • 그래서 자동으로 설정될 기본값을 설정하는 게 좋음
import React from 'react';

function Button(props) {
  console.log(props);
  return (
    <button style={{ color: props.color }}>
      {props.text} - {props.color}
    </button>
  );
}

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

export default Button;

 

실행화면

 

 

04) 부모 컴포넌트에서 자식요소 보내기

📑 부모 컴포넌트

import './App.css';
import Button from './components/Button';

export default function App() {
  return (
    <>
      <Button text={'메일'} />
      <Button text={'카페'} />
      <Button text={'블로그'}>
        <div>자식요소</div>
      </Button>
    </>
  );
}

 

📑 자식 컴포넌트

import React from 'react';

function Button({ text, children }) {
  return (
    <button>
      {text}
      {children}
    </button>
  );
}

export default Button;
  • 부모에서 자식 요소로 배치된 <div> 태그가 자동으로 자식 컴포넌트에서 'children'이라는 props로 전달이 됨

실행화면

 

 

 

03. Event Handling

  • 웹에서 이벤트가 발생했을 그것을 처리하는 것

01) 이벤트 핸들러

- 이벤트가 발생했을 때 실행될 수 있도록 설정한 함수

 

📑Button.jsx

 

- 방법 1 : 익명 함수

import React from 'react';

function Button({ text, children }) {
  return (
    <button
      onClick={() => {
        console.log(text);
      }}
    >
      {text}
      {children}
    </button>
  );
}

export default Button;
  • onClick = { () => {} } : 클릭 이벤트가 발생하였을 때 함수 실행

- 방법 2 : 함수 이름 전달

import React from 'react';

function Button({ text, children }) {
  const onClickButton = () => {
    console.log(text);
  };

  return (
    <button onClick={onClickButton} onMouseEnter={onClickButton}>
      {text}
      {children}
    </button>
  );
}

export default Button;
  • 함수의 이름만 전달해야 함 (함수의 호출 결과를 전달하면 안됨)
  • 콜백 함수 전달하듯 함수의 이름만 이벤트 핸들러로 설정하기
  • onClick() : 클릭할 때, onMouseEnter : 마우스 호버했을 때

02) 이벤트 객체

  • 리액트에서 발생하는 모든 이벤트들은 이벤트 핸들러 함수를 호출하면서 매개 변수로 이벤트 객체라는 것을 제공
import React from 'react';

function Button({ text, children }) {
  // 이벤트 객체
  const onClickButton = (e) => {
    console.log(e);
    console.log(text);
  };

  return (
    <button onClick={onClickButton} onMouseEnter={onClickButton}>
      {text}
      {children}
    </button>
  );
}

export default Button;

콘솔창

💡 합성 이벤트 객체

  • SyntheticBaseEvent : 모든 웹 브라우저의 이벤트 객체를 하나로 통일한 형태
  • Cross Browsing Issue : 브라우저 별 동작 방식이 달라 발생하는 문제
  • 합성 이벤트는 하나의 통일된 규격으로 이벤트 객체를 포맷팅해줌  →  Cross Browsing Issue를 해결
  • 정리하면, 모든 브라우저에서 사용할 수 있는 통합된 규격의 이벤트 객체
  • 합성 이벤트 객체 안에는 발생한 이벤트와 관련된 모든 정보가 들어있음

 

 

참고자료

이정환 Winterlood, '한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지'
반응형