코딩하는라민

[React] 컴포넌트(Component)와 Props 본문

Core/React

[React] 컴포넌트(Component)와 Props

코딩하는라민 2023. 2. 22. 22:30
728x90
반응형

[React] 컴포넌트(Component)와 Props

 

📌 컴포넌트

앱을 이루는 최소한의 단위를 말한다.

기존의 HTML 문서는 반복적인 부분을 단순히 하드코딩하여 재사용이 불가능했지만, 리액트에서는 컴포넌트를 통해 UI를 `재사용 가능``조각`으로 나눠서 각각 관리할 수 있다.

 

📌 함수 컴포넌트

function Cafe(props){
    return <h1>latte</h1>
}

props를 인자로 받아 react 엘리먼트를 반환한다.

최근에 함수형 컴포넌트를 많이 사용한다.

클래스 컴포넌트보다 간결하다.

 

📌 클래스 컴포넌트

ES6 class 를 사용하여 컴포넌트를 정의할 수도 있다.

class Cafe extends React.Component {
    render(){
        return <h1>latte</h1>
    }
}

함수 컴포넌트보다 더 많은 기능을 사용할 수 있다.

 

📌 컴포넌트 합성

Todos 을 여러 번 렌더링하는 Home 컴포넌트 만들기

function Todos(props){
    return <h1>I will {todo}</h1>
}

function Home() {
    return(
        <div>
            <Todos todo="eat" />
            <Todos todo="sleep" />
            <Todos todo="study" />
        </div>
    )
}

이렇게 최상위의 단일 컴포넌트를 가질 수도 있고, 작은 컴포넌트부터 시작해서 뷰 계층의 상단으로 올라가면서 작업해야할 수도 있다.

 

📌 컴포넌트 추출

function Home(){
    return(
        <div>
            <header>
                <h1>Hello React!</h1>
            </header>
            <main>
                <img src="" alt="" />
                <button>Go Home</button>
            </main>
            <footer>
                <p>welcome to my blog</p>
            </footer>
        </div>
    )
}

상위 컴포넌트 Home 에서 header, main, footer 단위로 하위 컴포넌트를 분리해보자.

컴포넌트를 분리하면 개별 컴포넌트를 관리하기 쉬워진다.

 

  • header 추출
function Header(){
    return(
        <header>
            <h1>Hello React!</h1>
        </header>
    )
}

function Home(){
    return(
        <div>
            <Header />
            <main>
                <img src="" alt="" />
                <button>Go Home</button>
            </main>
            <footer>
                <p>welcome to my blog</p>
            </footer>
        </div>
    )
}
  • main 추출
function Header(){
    return(
        <header>
            <h1>Hello React!</h1>
        </header>
    )
}

function Main(){
    return(
        <main>
            <img src="" alt="" />
            <button>Go Home</button>
        </main>
    )
}

function Home(){
    return(
        <div>
            <Header />
            <Main />
            <footer>
                <p>welcome to my blog</p>
            </footer>
        </div>
    )
}
  • footer 추출
function Header(){
    return(
        <header>
            <h1>Hello React!</h1>
        </header>
    )
}

function Main(){
    return(
        <main>
            <img src="" alt="" />
            <button>Go Home</button>
        </main>
    )
}

function Footer(){
    return(
        <footer>
            <p>welcome to my blog</p>
        </footer>
    )
}

function Home(){
    return(
        <div>
            <Header />
            <Main />
            <Footer />
        </div>
    )
}

 

📌 props

props 는 프로퍼티(propterties)의 줄임말로, 임의의 값을 컴포넌트에 전달할 수 있다.

상위 컴포넌트의 props 를 하위 컴포넌트에 전달하여 하위 컴포넌트에서도 그 값을 사용할 수 있다.

props 는 자바스크립트의 `객체 형태`로 전달된다.

그러나 props 는 `읽기전용`이기 때문에 수정할 수 없다.

 

📌 defaultProps

defaultProps 를 이용해서 props 에 기본값을 설정해줄 수 있다.

기본값 설정 시 값을 지정해주지 않아도 자동으로 props 로 들어간다.

function Home(){
   return(
        <div>{name}은 {age}살이다!</div>
   )
}

Home.defaultProps = {
    name: 'ramin',
    age: '20',
}

// ramin은 20살이다!

 

📌 여러개의 props와 구조 분해(비구조화) 할당

위의 방법처럼 기본값을 설정해줄 수도 있지만, 구조분해할당을 이용해서 props 를 전달해줄 수도 있다.

편한 방법을 선택해서 사용하기!

function Study() {
    return(
        <Button type="button" title="React" name="Start">
    )
}

 

function Button({title, name}){
    return(
        <button name={name}>{title}</button>
    )
}

function Study() {
    return(
        <Button type="button" title="React" name="Start">
    )
}

상위 컴포넌트의 props 를 구조분해할당으로 하위 컴포넌트의 인자로 넣어주면, 컴포넌트 안에서 상위 컴포넌트의 props을 호출하는 props. 을 앞에다 붙이지 않아도 변수명처럼 사용할 수 있다.

 

📌 props.children

function Eat(props){
    return(
        <div>{props.title}</div>
    )
}

function Sleep(props){
    return(
        <button>{props.title}</button>
    )
}

function Home(){
    return(
        <Todos style="border 1px solid pink">
            <Eat title="milk" />
            <Sleep title="right now" />
        </Todos>
    )
}

Eat, Sleep 컴포넌트를 Todos 컴포넌트로 감쌀 경우, Todos 에 설정한 스타일은 화면에 적용되지만 하위 컴포넌트는 렌더링되지 않는다.

이렇게 컴포넌트 사이의 하위 컴포넌트를 화면에 보이기 위해서는 아래와 같이 props.children 을 사용해야한다.

function Todos({children}){
    return(
        <div>{children}</div>
    )
}

 

 

 

 


참고 : MDN 문서, 리액트 공식 문서
  등을 공부하고, 간단하게 정리한 내용입니다. 잘못된 부분이나 문제되는 점이 있으면 댓글 부탁드립니다.

728x90
반응형