βš›οΈ React 2 - Component

Jae ChanΒ·2023λ…„ 7μ›” 4일
0

React

λͺ©λ‘ 보기
2/2
post-thumbnail

πŸ’« : 이 글은 VeloPert λ‹˜μ΄ λ§Œλ“œμ‹  μ±… λ¦¬μ•‘νŠΈλ₯Ό λ‹€λ£¨λŠ” 기술 둜 κ³΅λΆ€ν•œ λ‚΄μš©μ„ ν† λŒ€λ‘œ μ˜¬λ¦½λ‹ˆλ‹€.

이번 κΈ€μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•΄ μ•Œμ•„λ³΄λ €κ³  ν•œλ‹€. πŸ‘¨β€πŸ’»


μ»΄ν¬λ„ŒνŠΈ

μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)λ₯Ό κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μš”μ†Œμ΄λ‹€.
각 μ»΄ν¬λ„ŒνŠΈλŠ” 자체적으둜 독립적이며, μƒνƒœ(state)와 속성(props)을 κ°€μ§ˆ 수 μžˆλ‹€.

μ»΄ν¬λ„ŒνŠΈμ˜ κΈ°λŠ₯은 λ‹€μŒκ³Ό 같이 이루어진닀.

  • 데이터가 μ£Όμ–΄μ‘Œμ„ λ•Œ UIλ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€.
  • Life-Cycle APIλ₯Ό μ΄μš©ν•΄ μ»΄ν¬λ„ŒνŠΈμ˜ 변화에 λ”°λ₯Έ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.

μ»΄ν¬λ„ŒνŠΈμ˜ μ„ μ–Έ 방식

μ»΄ν¬λ„ŒνŠΈλ₯Ό μ„ μ–Έν•  수 μžˆλŠ” 방식은 두 가지이닀.

  • ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈ
  • ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈ

ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈ

ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ κ΅¬μ‘°λŠ” μ•„λž˜μ™€ 같이 이루어진닀.

import { Component } from 'react';

class App extends Component {
	render() {
    	const name = 'react';
      	return <div className="react"> {name} </div>;
    }
}

ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ 경우 state κΈ°λŠ₯ 및 라이프사이클 κΈ°λŠ₯을 μ‚¬μš©ν•  수 있으며
μž„μ˜ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

⚠️ μ€‘μš” 사항

  • render ν•¨μˆ˜κ°€ μžˆμ–΄μ•Ό ν•œλ‹€.
    λ˜ν•œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³΄μ—¬μ€˜μ•Ό ν•  JSXλ₯Ό λ°˜ν™˜ν•΄μ•Όν•œλ‹€.

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” λ‹€μŒκ³Ό 같은 ꡬ쑰둜 이루어진닀.

const MyComponent = () => {
	return <div> λ¦¬μ•‘νŠΈ μ–΄λ ΅λ‹€. </div>
};

export default MyComponent;

μ—¬κΈ°μ„œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ function ν‚€μ›Œλ“œκ°€ μ•„λ‹Œ ES6μ—μ„œ λ„μž…λœ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μž‘μ„±ν–ˆλ‹€.

ν™”μ‚΄ν‘œ ν•¨μˆ˜

ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ 전달할 λ•Œ μ‚¬μš©ν•˜λŠ” 문법이며, ES6 λ¬Έλ²•μ—μ„œ ν•¨μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 방식

// 기쑴의 ν•¨μˆ˜ μ„ μ–Έ 방식
setTimeout(function () {
	console.log("Hello World !");
}, 1000);

// ES6 - ν™”μ‚΄ν‘œ ν•¨μˆ˜
setTimeout(() => {
	console.log("Hello World !");
}, 1000);

κΈ°μ‘΄ ν•¨μˆ˜μ™€ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ 차이점은 κ°€λ¦¬ν‚€λŠ” 객체가 λ‹€λ₯΄λ‹€.
일반 ν•¨μˆ˜μ˜ κ²½μš°λŠ” μžμ‹ μ΄ μ’…μ†λœ 객체λ₯Ό this둜 가리킨닀.
ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ κ²½μš°λŠ” μžμ‹ μ΄ μ’…μ†λœ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀.


props

μ»΄ν¬λ„ŒνŠΈμ˜ 속성을 μ„€μ •ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μš”μ†Œμ΄λ‹€.

propsλŠ” propertiesλ₯Ό 쀄인 ν‘œν˜„μœΌλ‘œ props 값은 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©ν•˜λŠ” λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ„€μ •ν•œλ‹€.

  • props의 값을 μ§€μ •ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ κΈ°λ³Έκ°’ μ„€μ • : defaultProps
const MyInfoComponent = props => {
	return (
    	<div>
      		μ•ˆλ…•ν•˜μ„Έμš”. 제 이름은 {props.myName} μ΄μ—μš”!
      	</div>;
    );
}

MyInfoComponent.defaultProps = {
	myName : 'κΈ°λ³Έ 이름'
};

export defualt MyInfoComponent;

비ꡬ쑰화 ν• λ‹Ή

ES6의 비ꡬ쑰화 ν• λ‹Ή 문법을 μ΄μš©ν•˜μ—¬ λ‚΄λΆ€ 값을 λ°”λ‘œ μΆ”μΆœν•  수 μžˆλŠ” 방법이 μžˆλ‹€.
이λ₯Ό μ΄μš©ν•  경우 λ§Žμ€ props의 값을 핸듀링할 수 μžˆλ‹€.

import React from "react";

const Props = (props) => {
  // 객체 비ꡬ쑰화 ν• λ‹Ή
  const { nickname, age, job } = props;
  return (
    <div>
      λ‚΄ λ‹‰λ„€μž„ : {nickname} <br />
      λ‚΄ λ‚˜μ΄ : {age} <br />
      λ‚΄ 직업 : {job} <br />
    </div>
  );
};

export default Props;

이 뿐만 μ•„λ‹ˆλΌ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°κ°€ 객체일 경우 ν•΄λ‹Ή 값을 λ°”λ‘œ λΉ„κ΅¬μ‘°ν™”ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

import React from "react";

// νŒŒλΌλ―Έν„°μ— 객체λ₯Ό λ°”λ‘œ 전달!
const Props = ({ nickname, age, job }) => {
  return (
    <div>
      λ‚΄ λ‹‰λ„€μž„ : {nickname} <br />
      λ‚΄ λ‚˜μ΄ : {age} <br />
      λ‚΄ 직업 : {job} <br />
    </div>
  );
};

export default Props;

propTypes (props νƒ€μž… 검증)

μ»΄ν¬λ„ŒνŠΈμ—μ„œ ν•„μˆ˜ propsλ₯Ό μ•Œλ €μ£Όκ±°λ‚˜ prop의 νƒ€μž…μ„ 지정할 λ•ŒλŠ” propTypesλ₯Ό μ‚¬μš©ν•œλ‹€.

⚠️ μ€‘μš” 사항

  • import ꡬ문을 톡해 PropTypesλ₯Ό λΆˆλŸ¬μ™€μ•Ό 함.

μ‚¬μš© μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

import React from "react";
import PropTypes from "prop-types";

const PropType = ({ name, age }) => {
  return (
    <div>
      λ‚΄ 이름 : {name} <br/>
      λ‚΄ λ‚˜μ΄ : {age}
    </div>
  );
};

PropTypes.propTypes = {
  name: PropType.string, // λ¬Έμžμ—΄λ§Œ 받도둝 지정
  age: PropType.number.isRequired, // 숫자만 받도둝 지정, 값이 ν•„μˆ˜λ‘œ 듀어와야 ν•œλ‹€.
  
};

export default PropTypes;

state

μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ λ°”λ€” 수 μžˆλŠ” 값을 μ˜λ―Έν•œλ‹€.

μ—¬κΈ°μ„œ props와 차이점은 props의 경우 μ»΄ν¬λ„ŒνŠΈκ°€ μ‚¬μš©λ˜λŠ” κ³Όμ •μ—μ„œ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ μ„€μ •ν•˜λŠ” 값이닀. λ”°λΌμ„œ μ»΄ν¬λ„ŒνŠΈ μžμ‹ μ€ ν•΄λ‹Ή propsλ₯Ό 읽기 μ „μš©μœΌλ‘œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯함.

μ—¬κΈ°μ„œ propsλ₯Ό λ°”κΎΈλ €λ©΄ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ°”κΏ”μ€˜μ•Ό ν•œλ‹€.

⚠️ μ€‘μš” 사항

  • 직접 μˆ˜μ •ν•˜μ§€ 말고 setStateλ₯Ό μ‚¬μš©ν•œλ‹€.
    μƒνƒœλ₯Ό λ³€κ²½ν•  λ•ŒλŠ” 직접 μˆ˜μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ setState() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    μ΄λŠ” λ¦¬μ•‘νŠΈμ˜ μƒνƒœ μ—…λ°μ΄νŠΈλ₯Ό κ΄€λ¦¬ν•˜κ³  μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•¨μ΄λ‹€.

  • μƒνƒœλŠ” λΆˆλ³€μ„±μ„ μœ μ§€ν•΄μ•Ό ν•œλ‹€.
    setState() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•  λ•Œ 이전 μƒνƒœλ₯Ό 직접 λ³€κ²½ν•˜μ§€ μ•Šκ³ ,
    μƒˆλ‘œμš΄ μƒνƒœ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • λΉ„λ™κΈ°λ‘œ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλ‹€.
    setState() λ©”μ„œλ“œλŠ” λΉ„λ™κΈ°λ‘œ λ™μž‘ν•  수 μžˆλ‹€.
    μ—¬λŸ¬ 번의 μƒνƒœ μ—…λ°μ΄νŠΈκ°€ μžˆμ„ 경우, 이전 μƒνƒœμ— μ˜μ‘΄ν•˜λŠ” κ²½μš°μ—λŠ” ν•¨μˆ˜ν˜• μ—…λ°μ΄νŠΈλ‚˜ 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•ˆμ •μ μœΌλ‘œ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Ό ν•œλ‹€.

  • μƒνƒœ μ΄ˆκΈ°ν™”λŠ” μƒμ„±μž λ˜λŠ” useState() 훅을 μ‚¬μš©ν•œλ‹€.
    클래슀 μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€. ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” useState() 훅을 μ‚¬μš©ν•˜μ—¬ 초기 μƒνƒœλ₯Ό μ„€μ •ν•  수 μžˆλ‹€.

λ‚΄κ°€ 배운 λ‚΄μš©μœΌλ‘œ μž‘μ„±ν•œ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μ•˜λ‹€.

import React, { useState } from "react";
/*  useState μ‚¬μš©ν•΄λ³΄κΈ°.
    Hooks & 비ꡬ쑰화 ν• λ‹Ή 이용 */
const Say = () => {
  const [message, setMessage] = useState("");
  const onClickEnter = () => setMessage("μ•ˆλ…•ν•˜μ„Έμš” ! 😊");
  const onClickLeave = () => setMessage("μ•ˆλ…•νžˆ κ°€μ„Έμš” ! 😎");

  const [color, setColor] = useState("black");

  return (
    <div>
      <button onClick={onClickEnter}>μž… μž₯</button>
      <button onClick={onClickLeave}>퇴 μž₯</button>
      <h1 style={{ color }}>{message}</h1>
      <button style={{ color: "red" }} onClick={() => setColor("red")}>
        빨간색
      </button>
      <button style={{ color: "green" }} onClick={() => setColor("green")}>
        μ΄ˆλ‘μƒ‰
      </button>
      <button style={{ color: "blue" }} onClick={() => setColor("blue")}>
        νŒŒλž€μƒ‰
      </button>
    </div>
  );
};

export default Say;

ν•΄λ‹Ή μ½”λ“œμ˜ κΈ°λŠ₯은 ν•œ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ useStateλ₯Ό μ‚¬μš©ν•΄ λ²„νŠΌ μž…λ ₯에 λ”°λ₯Έ ν…μŠ€νŠΈμ™€ 색상이 λ³€κ²½λ˜λŠ” κΈ°λŠ₯을 κ°–κ³  μžˆλ‹€.

μ—¬κΈ°μ„œ message와 setMessageκ°€ λ‹΄κΈ΄ 배열을 비ꡬ쑰화 ν• λ‹Ήν•˜μ—¬ 첫 번째 μ›μ†Œλ₯Ό ν˜„μž¬ μƒνƒœ, λ‘λ²ˆ μ§Έ μ›μ†ŒλŠ” μƒνƒœλ₯Ό λ°”κΎΈμ–΄ μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€. 이 ν•¨μˆ˜λ₯Ό μ„Έν„° ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹€!

λ‹€μŒμ€ λ Œλ”λ§ν•œ 결과이닀.


  • 정리 βœ…

props와 state λ‘˜ λ‹€ λΉ„μŠ·ν•΄ 보일 수 μžˆμ§€λ§Œ 역할이 맀우 λ‹€λ₯΄λ‹€.
props의 경우 λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ μ„€μ •ν•˜κ³  state의 경우 μ»΄ν¬λ„ŒνŠΈ 자체적으둜 μ§€λ‹Œ κ°’μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ 값을 μ—…λ°μ΄νŠΈ ν•  수 μžˆλŠ” 차이점이 μžˆλ‹€.

ν•˜μ§€λ§Œ propsλ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•΄μ„œ ν•΄λ‹Ή 값이 무쑰건 κ³ μ •λ˜λŠ” 것이 μ•„λ‹ˆλ©° λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ stateλ₯Ό μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ props에 전달해 ν˜ΈμΆœν•˜λ©΄ props도 μœ λ™μ μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것이닀.

Reference

profile
πŸ‹

0개의 λŒ“κΈ€