컴포넌트는 잠재적으로 재사용이 가능한 구성 요소로 리액트 개발자가 생성할 수 있고 차후에 혼합하여 전반적인 UI를 구축할 수 있다.
결국 리액트 애플리케이션은 컴포넌트를 결합하여 만들어지는 것이다.
컴포넌트는 HTML과 경우에 따라 CSS코드, 관련된 자바스크립트 로직 등을 감싼다고 볼 수 있다.
이로 인해 복잡한 사용자 인터페이스를 관리하기 쉽도록 작게 분리하여 다른 위치에서도 사용할 수 있게 해준다.
컴포넌트 접근 방식의 가장 큰 장점이다.
JSX는 JavaScript Syntax Extension, 즉 JavaScript 문법 확장자를 의미한다.
이 확장자는 개발자가 자바스크립트 파일 내에 HTML 마크업 코드를 작성하여 HTML 요소를 설명하고 생성할 수 있게 해준다.
JSX는 브라우저에는 사용할 수 없지만 브라우저에 도달하기 전에 개발 서버에서 변환되어 보다 편리하게 UI를 생성할 수 있다.
// div 태그로 감싸기
function App() {
return(
<div>
<h2>Hello</h2>
<h2>World</h2>
</div>
)
}
// Fragment(<></>)로 감싸기
function App() {
return(
<Fragment>
<h2>Hello</h2>
<h2>World</h2>
</Fragment>
)
}
function App() {
return(
<>
<h2>Hello</h2>
<h2>World</h2>
</>
)
}
function App() {
const name = 'Tom';
return(
<>
<h2>Hello</h2>
<h2>{name}</h2>
</>
)
}
props는 properties의 줄임말로 상위 컴포넌트가 하위 컴포넌트에 값을 전달할때 사용한다.
props는 객체이며 하위 컴포넌트에서 props.이름(key)으로 접근할 수 있다.
// 상위 컴포넌트
import Header from './components/Header';
function App() {
return(
<>
<Header name="Tom"/>
</>
);
}
// 하위 컴포넌트
function Header(props) {
return(
<header>
<h2>{props.name}</h2>
</header>
)
}
// 상위 컴포넌트
import Header from './components/Header';
function App() {
const info = {
name: 'Tom',
age: 18
}
return(
<>
<Header {...info}/>
</>
);
}
// 하위 컴포넌트
function Header({name, age}) {
return(
<header>
<h2>{name}</h2>
<h2>{age}</h2>
</header>
)
}
// 상위 컴포넌트
import Header from './components/Header';
function App() {
return(
<>
<Header>My name is Tom</Header>
</>
);
}
// 하위 컴포넌트
function Header(props) {
return(
<header>
<h2>{props.children}</h2> // <h2>My name is Tom</h2>
</header>
)
}
// 상위 컴포넌트
import Header from './components/Header';
function App() {
return(
<>
<Header id="basicHeader" className="headerClass">
My name is Tom
</Header>
</>
);
}
// 하위 컴포넌트
function Header({children, ...props}) {
return(
<header {...props}> // <header id="basicHeader" className="headerClass">
<h2>{children}</h2>
</header>
)
}
// 상위 컴포넌트
import Header from './components/Header';
function App() {
return(
<>
<Header id="basicHeader" className="headerClass">
My name is Tom
</Header>
</>
);
}
// 하위 컴포넌트
function Header({children, ...props, HeaderContainer = 'div'}) {
return(
<HeaderContainer> // <div>로 작동
<header {...props}> // <header id="basicHeader" className="headerClass">
<h2>{children}</h2>
</header>
</HeaderContainer>
)
}
리액트 Hook중 하나인 useState는 컴포넌트의 상태를 편하게 생성하고 관리할 수 있는 도구이다.
state 생성과 동시에 가져야할 초기값을 useState 함수에 인자로 넣어주면 state와 setState를 배열 형태로 리턴해준다.
const [state, setState] = useState(); // [현재 상태, 상태 업데이트 함수]
컴포넌트의 현재 상태 값은 state 변수에 담겨져있고, setState함수를 이용해 변경할 수 있다.(state & setState는 마음대로 지정 가능)
state가 변경되면 해당 컴포넌트는 다시 렌더링이 된다.