본문 바로가기

Web/React

Component

<React>

React: JavaScript Library For Building User Interfaces

Component: 사용자가 정의한 태그 (사용자가 만든 태그)

   → props를 input으로 하고 react element를 output으로 하는 함수

   → component를 작성하면,

      1) 가독성을 획기적으로 높일 수 있다. (복잡한 코드를 태그만을 명시하는 것을 통해 숨길 수 있다.)

      2) 한 번 정의해놓으면 여러 곳에서 재사용할 수 있다.

      3) 유지보수가 쉽다. (component를 수정하면 사용하는 모든 곳에서 수정사항이 자동으로 업데이트된다.)

 

 

 

<component>

html으로 작성할 때

- 그냥 html으로 작성한다면 위와 같이 코드가 길게 늘어져 있을 것이다.

  예시에서는 코드가 짧으니까 괜찮은데 코드가 많이 길어진다고 생각하면 내용을 보기도 어렵고 복잡할 것이다.

 

 

component를 사용해 수납상자에 정리하고 이름만 써서 코드의 내용을 불러온다고 생각하자.

component로 정리

- component는 정리 정돈의 도구로 생각

- 수납 상자에 물건들을 넣어 우리 눈에 보이지 않도록 하고 이름을 붙여 구분한다.

   ex) <Subject></Subject>, <TOC></TOC>, <Content></Content>

- 복잡도를 획기적으로 낮출 수 있다.

- component의 이름은 대문자로 시작해야 한다.

- 해당 코드를 각각 Subject, TOC, Content라는 이름의 component에 넣어 정리하고 

   App class에는 우리 눈에 코드가 안 보이게 이름(<Subject></Subject>, <TOC></TOC>, <Content></Content>)

   만 써준 상태다. 

 

 

 

cf) component 만들기

class App extends Component {
	render() {
		return (
      		<div className="App">
       	 	<Subject></Subject>
       	 	<TOC></TOC>
       	 	<Content></Content>
      		</div>
    	);
  	}
}

- Component라고 하는 react가 가지고 있는 class를 상속해서 새로운 class인 App이라는 class를 만든다.

- App이라는 class는 render()라는 메소드를 가지고 있다.

 - component를 만들 때 반드시 단 하나의 최상위 태그로 시작해야 한다. (ex.  <div className="App">)

 

 

 

 

<props>

<Subject></Subject>

- 위와 같이 쓰면 계속 같은 내용이 반복된다.("Web"과 "world wide web"을 출력)

- 코드의 내용을 조금씩 바꿔서 출력할 수는 없을까?

   → props(속성) 사용

 

 

 

ex1) props 사용

class Subject extends Component {
	render(){
    	return (
			<header>
			<h1>{this.props.title}</h1>
			{this.props.sub}
            		</header>  
		);
	}
}


<Subject title="WEB" sub="world wide web!"></Subject>

-  Web 자리는 {this.props.title}, world wide web 자리는 {this.props.sub}로 변경 (중괄호 사용)

- 아래 <Subject> 불러올 때 원하는 속성값 부여

    ex. <Subject title="WEB" sub="world wide web!"></Subject>

           <Subject title="React" sub="for UI"></Subject>

 

 

 

ex2) props 사용

class Content extends Component{
  render(){
    return (
      <article>
	<h2>{this.props.title}</h2>
	{this.props.desc}
      </article>
    );
  }
}
 
<Content title="HTML" desc="HTML is HyperText Markup Language."></Content>

- {this.props.title}, {this.props.desc}로 변경

-  아래 title값과 desc값 원하는 대로 부여

 

 

 

<Component를 별개의 파일로 분리하기>

component 파일로 분리하기

- 만약 하나의 파일 안에 1000개의 component가 있다면

    (1) 파일이 너무 복잡하고

    (2) 다른 파일들에서는 이 파일 안에 있느 component를 가져다 쓰기가 어렵다.

 

 → 각각의 component를 별도의 파일들로 쪼갠다. 

     App.js에서는 component 부분을 제거해도 된다. (외부의 파일에서 불러올 수 있기 때문)

 

- import문으로 어느 파일에서 component를 불러왔는지 명시해준다.

   ex) import TOC from "./components/TOC";

- export문으로 외부에서도 이 component를 사용할 수 있도록 명시해준다.

   ex) export default TOC;