React에서 컴포넌트를 선언하는 방식에는 두 가지 방법이 있다.
하나는 클래스형 컴포넌트이고, 또 다른 하나는 함수형 컴포넌트이다. 과거에는 클래스형 컴포넌트를 사용했지만, 2019년 v16.8 부터 함수형 컴포넌트에 리액트 훅(hook)을 지원해 주어서 현재는 공식 문서에서 함수형 컴포넌트와 훅을 함께 사용할 것을 권장하고 있다.
그래도 과거에 사용했던 클래스 컴포넌트로 개발한 이력이 남아있는 서비스의 유지보수를 해야하는 상황이 있을 수 있기 때문에 두가지 방식을 다 알아놓을 필요가 있다.
import React, {Component} from 'react'
class App extends Component {
render() {
const name = 'class'
return <div>{name}</div>
}
}
export default App
import React from 'react'
const App = () => {
const name = 'function'
return <div>{name}</div>
}
export default App
state란 컴포넌트 내부에서 바뀔 수 있는 값을 말한다.
import React, {Component} from 'react'
class App extends Component {
constructor(props) {
super(props);
this.state = {
number: 1
};
or
state = {
number: 1
}
}
plusNumFunction = () => {
this.setState({ number: number + 1 })
}
retnder() {
<p>Number : {this.state.number}</p>
}
}
export default App
import React, {useState} from 'react'
const App = () => {
const [num,SetNum] = useState(0)
const plusNum = () => {
setNum(num+1)
}
<button onClick={plusNum}>+</button>
return <div>{num}</div>
}
export default App
✔️ 컴포넌트의 속성을 설정 할 때 사용하는 요소이다.
✔️ 읽기전용!
✔️ 컴포넌트 자체 props를 수정해서는 안 된다.
✔️ 모든 React 컴포넌트는 자신의 props를 다룰 때 반드시 순수 함수처럼 동작해야한다.
✔️ 수정 되는 것은 state여야 한다.
import React, {Component} from 'react'
class App extends Component {
render() {
const {name,age} =this.props
return
<div>
안녕하세요 제 이름은 {name} 입니다.
나이는 {age} 입니다.
</div>
}
}
import React from 'react'
const App = (props) => {
return
<div>
안녕하세요 제 이름은 {props.name} 입니다.
나이는 {props.age} 입니다.
</div>
}
export default App
or
import React from 'react'
const App = ({name,age}) => {
return
<div>
안녕하세요 제 이름은 {name} 입니다.
나이는 {age} 입니다.
</div>
}
export default App
import React, {Component} from 'react'
class App extends Component {
constructor(props) {
super(props);
this.state = {
number: 1
};
plusNumFunction = () => {
this.setState({ number: number + 1 })
}
retnder() {
<div>
<button onClick={this.plusNumFunction}>버튼</button>
</div>
}
}
export default App
import React, {useState} from 'react'
const App = () => {
const [num,SetNum] = useState(0)
const plusNum = () => {
setNum(num+1)
}
<button onClick={plusNum}>+</button>
return <div>{num}</div>
}
export default App
클래스형 컴포넌트는 다른 말로 stateful 컴포넌트, 함수형 컴포넌트는 stateless 컴포넌트라고 하기도 한다. 클래스형 컴포넌트는 로직과 상태를 컴포넌트 내에서 구현하기 때문에 stateful로 불리는 것이며 상대적으로 복잡한 UI로직을 가지고 있다. 반면 함수형 컴포넌트는 state를 사용하지 않고 단순하게 데이터를 받아서(props) UI에 뿌려주기 때문에 stateless라고 불리는 것이다. 리액트 훅이 등장하면서 함수형 컴포넌트를 더 많이 사용하는 추세가 되었지만 오래된 리액트 코드의 경우 클래스형 컴포넌트로 이루어진 경우가 더 많으므로 두 가지 모두 다 잘 알고있어야 리액트로 개발을 할 때 어려움을 겪지 않을 것이라고 생각한다.
참조 👇