리액트로 작성된 화면은 component로 구성되어 있기 때문에, 해당 개념은 매우 중요하다.
이를 정확하게 알아보자.
React로 이루어진 앱을 이루는
최소한의 단위
기존의 웹 프레임워크는 MVC 방식으로 분리하여 관리하기에 각 요소의 의존성이 높았다.
때문에, 재활용성이 어렵다는 단점이 발생하였다.
하지만, Component가 등장한 이후로는 MVC의 뷰를 독립적으로 구성하는 것이 가능해졌다.
재사용이 가능하여 새로운 컴포넌트 또한 쉽게 만들 수 잇게 되었다.
따라서, Component는 데이터를 props로 입력받아, state 상태를 비교하여 DOM Node를 출력하는 함수이다.
이름은 항상 대문자
로 시작해야 한다.
리액트에서 소문자로 시작하는 component는 DOM태그로 취급하기 때문이다.
UI를 구성할 때, 재사용 가능
한 개별적인 여러 조각으로 나누고, 각 조각별로 코딩하는 것이 바람직하다.
props
라고 하는 임의의 데이터를 입력 받은 후, 화면에 어떻게 표시되는지를 기술하는 React Element를 반환한다.
리액트에서 정의하고 있는 컴포넌트의 종류는 크게 클래스형과 함수형 컴포넌트 2가지로 나타낸다.
컴포넌트 구성 요소, 리액트 생명 주기를 모두 포함하고 있다.
주로 프로퍼티, state, 생명주기 함수가 필요한 구조의 컴포넌트를 만들 때 사용한다.
예제 코드를 보자.
import React from 'react';
class MyComponent extends React.Component{
constructor(props){
super(props);
}
componentDidMount(){
}
render(){
return <div>My name is {this.props.name}</div>;
}
}
export default MyComponent;
생성자 함수로 props를 생성하고, 상속받은 생명주기 함수를 사용할 수 있다.
클래스형 컴포넌트는 render( ) 함수를 통해 UI를 보여준다.
클래스 컴포넌트의 핵심은
class
키워드와Component
의 상속이 필요하며, 반드시render()
함수가 사용되어야 한다는 것이다.
가장 간단하게 컴포넌트를 정의하는 방식으로 자바스크립트 함수를 작성한다.
주로 props에만 의존하는 UI를 렌더링하는데 선호되는 방식이다.
예제코드를 보자.
import React from 'react';
function MyComponent(props){
return <div>My name is {props.name}</div>;
}
export default MyComponent;
마지막 export
구문을 통해, 다른 파일에서 MyComponent를 import할 수 있도록 한다.
이 두가지 방식의 차이는 무엇일까?
클래스형
함수형
클래스 이후에 나온 것이 함수형이기에 코드적으로 편한 것은 사실이다. 하지만, 클래스 컴포넌트를 사용한 프로젝트가 여전히 많기에 우리는 유지보수를 위해서라면 알아야할 필요성이 존재한다.
여기서 state란 컴포넌트 내부에서 바뀔 수 있는 값을 말한다.
클래스형
constructor(props){
super(props);
this.state = {
name : "seohee",
age : 12,
};
}
class MyComponent extends React.Component{
state = {
name : "seohee",
age : 12,
};
};
this.state = { name : "seohee", age : 12 };
onClick = {()=>{
this.setState({ name : "SEOHEE"});
}};
함수형
const [name, setName] = useState("seohee");
props는 component의 속성을 설정 할 때 사용하는 요소이며 오로지 읽기 전용이다.
때문에, 컴포넌트 자체 props를 수정해서는 안되며 모든 React component가 자신의 props를 다룰 때, 반드시순수함수
처럼 작동해야 한다.
수정되는 것은 state라는 것을 잊지말자.
클래스형
class Child extends React.Component{
render(){
const {name, age } = this.props;
return (
<div>
<div> NAME : { name }</div>
<div> AGE : { age }</div>
</div>
);
}
}
import Child from '/Child';
class Parent extends React.Component{
state = {
name : "seohee",
age : 12,
}
render(){
return(
<div>
<Child name={this.state.name} age={this.state.age}/>
</div>
)
}
함수형
const MyComponent = ({name, age}){
return(
<div>
<div> NAME : {name}</div>
<div> AGE : {age} </div>
</div>
);
};
클래스형
class MyComponent extends React.Component{
state = {
name = '',
age = 0,
}
handleChange = e =>{
this.setState({name : e.target.value});
}
handleClick = () => {
this.setState({ name : ''});
}
render(){
return(
<div>
<input type="text" name="name" value={this.state.name} onChange={this.handleChange}/>
<button onClick ={this.handleClick}>확인</button>
</div>
)
}
}
함수형
function MyComponent(props){
let [name, setName ] = useState('');
const onChangeName = e => {
setName(e.target.value);
};
const onClick = () => {
setName('');
};
const onKeyPress = e => {
if(e.key === 'Enter'){
onClick();
}
};
return(
<div>
<input type="text" name="name" value={name} onChange={onChangeName} onKeyPress={onKeyPress}/>
<button onClick={onClick}>확인</button>
</div>
)
}
📚 학습할 때, 참고한 자료 📚