일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- PROJECT
- jQuery
- 깃
- react
- git
- 슬라이드전환
- 생활코딩
- JS
- 프론트엔드
- web
- 코딩독학
- 웹디자인기능사실기
- 정보처리기사
- 연산자
- github
- 실기
- 웹디자인기능사
- 비전공자
- 코드공유
- 웹퍼블리셔
- HTML
- 리액트
- 렛츠기릿자바스크립트
- 타입스크립트
- 자바스크립트
- 세로메뉴바
- CSS
- 웹디실기
- Supabase
- JavaScript
- Today
- Total
코딩하는라민
[React] 컴포넌트(Component)와 Props 본문
[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 문서, 리액트 공식 문서
등을 공부하고, 간단하게 정리한 내용입니다. 잘못된 부분이나 문제되는 점이 있으면 댓글 부탁드립니다.
'Core > React' 카테고리의 다른 글
[React] 조건부 렌더링 (0) | 2023.02.25 |
---|---|
[React] state 와 setState() - 클래스형 컴포넌트 (0) | 2023.02.25 |
[React] 이벤트 처리하기 (0) | 2023.02.22 |
[React] JSX 이해하기 (0) | 2023.02.22 |
[React] 리액트(React) 시작하기 / JSX와 create-react-app (1) | 2023.02.21 |