리액트를 공부하며 컴포넌트라는 말이 항상 나왔었는데 컴포넌트라는 것이 정확하게 어떤 것을 의미하는 것이며, 이 컴포넌트는 어떨 때 왜 써야하는지 궁금했다. 정리가 필요하다고 느꼈다!
❗️ 실질적인 용도를 생각해보자면 ❗️
1. 사이트에서 반복적으로 나타나는 페이지들
2. 내용이 매우 자주 변경될 것 같은 HTML
3. 한 사이트의 다른 페이지
4. 팀으로 협업할때, 컴포넌트 단위로 나누어서 작업하기도 함
이정도로 정리해볼 수 있다.
예를 들어서 게시글을 클릭하면 나타나는 모달창을 하나 구현해본다고 가정해보자.
/* eslint-disable*/
import "./App.css";
function App() {
return (
<div className="App">
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
</div>
);
}
export default App;
예시를 드느라 지금의 코드는 짧지만, 만약에 사이트의 규모가 커져서 저런 div 덩어리가 여러개 있다고 가정했을 때
한곳에 모든 div들을 넣어주는것은 효율적이지 못하다
이럴때 저 모달창을 컴포넌트화 해서 간단하게 만들어 줄 수있다.
<div></div> // html태그로 처리
<Div></Div> // 컴포넌트로 처리
// 컴포넌트 만드는 섹션
function Modal () { // 1. function 화
return ( // 2. return ( ) 안에 HTML 내용 작성
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
)
// 메인 function App () { } 부분
function App() {
return (
<div className="App">
{<Modal></Modal>} // 컴포넌트로 만들어준 모달창
// </Modal> 이렇게 하나만 작성해주어도 상관없음
</div>
);
}
// 1. 큰 <div></div> 태그로 내용 감싸주기
function Modal() {
return (
<div>
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
</div>
);
}
// 2. fragments 문법 사용
function Modal() {
return (
<>
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
</>
);
}
그럼 컴포넌트를 최대한 많이 만들어서 따로 다 관리해주는게 좋은거 아닌가? 라는 생각이 들지만, 그렇게 하면 부작용이 발생한다.
//메인 페이지
function App() {
let [글제목, 글제목변경] = useState(["글제목1", "글제목2", "글제목3"]);
let [좋아요갯수, 좋아요갯수변경] = useState(0);
return (
<div className="App">
<div className="black-nav">
<h4>블로그</h4>
</div>
<div className="list">
<h4>
<span
onClick={() => {
let copy = [...글제목];
copy[0] = "글제목1 변경";
글제목변경(copy);
}}
>
{글제목[0]}
</span>{" "}
<span
onClick={() => {
좋아요갯수변경(좋아요갯수 + 1);
}}
>
{" "}
👍{" "}
</span>
{좋아요갯수}
</h4>
<p>2월 17일 발행</p>
</div>
<div className="list">
<h4>{글제목[1]}</h4>
<p>2월 17일 발행</p>
</div>
b
<div className="list">
<h4>{글제목[2]}</h4>
<p>2월 17일 발행</p>
</div>
{<Modal></Modal>}
</div>
);
}
// 컴포넌트
function Modal() {
return (
<>
<div className="modal">
<h4> 글제목[0] </h4> // 다른 함수에 있는 변수이기 때문에 에러가 남
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
<div className="modal">
<h4> 제목 </h4>
<p> 날짜 </p>
<p> 상세내용 </p>
</div>
</>
);
}
만약에 이런식으로 컴포넌트에서 메인 페이지에 있는 변수를 옮겨 쓴다고 할때, 어느 함수에서 선언한 변수는 다른
함수에서 사용할 수 없으므로 오류가 난다. 메인 페이지에 있는 변수를 컴포넌트에서 사용하기 위헤서 props 문법을
사용하는데, props를 사용한다고 하더라도 필요없는 변수들까지 다 props로 연결지어봤자 가독성과 효율이
떨어지므로 컴포넌트도 적재적소에 사용해주는 것이 중요하다 !