
class Welcome extends React.Component {
render() {
return <h1>Hello</h1>;
}
}
render() 함수를 사용한다. 리액트는 클래스형 컴포넌트의 render() 함수를 자동으로 실행시킨다.function Welcome(props) {
return <h1>Hello</h1>;
}
props 객체 인자를 받은 후 React 엘리먼트를 반환한다. 이때 props는 속성을 나타내는 데이터다.state와는 다르게, props은 컴포넌트 외부에서 데이터를 제공받는다.props는 컴포넌트에서 컴포넌트로 전달하는 데이터다. 컴포넌트의 속성으로, 해당 컴포넌트를 불러와 사용하는 부모 컴포넌트에서만 설정 가능하다.props는 <ComponentName prop1={propValue1} prop2={propValue2} ... /> 형태로 컴포넌트를 부를 때 함께 지정한다. 아래 코드에서는 Dog 컴포넌트에 name prop와 age prop를 지정하였다.
<Dog name="Ari" age={10} />
<Dog name="Bori" age={7} />
props 값 적용으로props 값은 다르나, 패턴 동일하게 효율적인 컴포넌트 재사용 가능props는 읽기 전용 이므로 컴포넌트의 내부에서 props를 수정해서는 안 된다. 입력값을 수정하지 않는 함수를 순수 함수라고 호칭하며, 모든 React 컴포넌트는 자신의 props를 다룰 때, 순수 함수처럼 동작해야한다.
props를 받는 함수형 컴포넌트에 인자를 정의하면, props를 속성으로 가지는 객체 Object가 해당 인자로 전달된다. 컴포넌트 내부에서 사용 시, 객체에 존재하는 값을 가져오듯 점 연산자(.)를 사용하여 원하는 props를 꺼내 쓸 수 있고, 이를 중괄호로 감싸 { [인자 이름].[props 이름] } 형태로 사용한다.
// 객체 인자를 통해 props 받아오기
function Dog(props) {
return {
<div>{props.name}</div>
<div>{props.age}</div>
}
}
props를 받을 때, 구조 분해 할당(참조)을 사용하여 아래와 같이 점 연산자 사용을 줄일 수 있다.
'prop-types' 라이브러리를 통해 컴포넌트의 특별한 프로퍼티인 propTypes를 선언하여 컴포넌트가 받은 props의 타입을 확인하거나, defaultProps 프로퍼티를 할당하여 props의 초기값을 정의할 수 있다.
Typechecking with Proptypes - React Docs(참조)
// 객체 인자를 구조 분해 할당하여 props 받아오기
function Dog({ name, age }) {
return {
<div>{name}</div>
<div>{age}</div>
}
}
// 컴포넌트 props 초기값 지정
Dog.defaultProps = {,
name: '이름',
age: 0,
}
// 컴포넌트 props 타입 확인
Dog.propsTypes = {,
name: PropTypes.string.isRequired,
age: PropTypes.number,
}
클래스형 컴포넌트에서 props를 사용할 때는 this.props로 불러와 사용한다. 클래스형 컴포넌트에서 propTypes나 defaultProps를 사용할 때는, 클래스 내부에서도 지정할 수 있다.
// 클래스형 컴포넌트에서 props 사용하기
class Dog extends React.Component {
static defaultProps = { ... }; // 컴포넌트 props 초기값 지정
static propTypes = { ... }; // 컴포넌트 props 타입 확인
render() {
// 구조 분해 할당으로 props 사용
const { name, age } = this.props;
return <div>{name}</div>;
}
}
state는 컴포넌트 UI를 위한 데이터가 저장된 오브젝트로, props나 state의 값이 바뀌면 그 컴포넌트의 render 함수가 다시 호출된다. render 함수가 가지고 있는 하위의 컴포넌트들의 각 render 함수도 다시 호출된다. 즉 props나 state의 값이 바뀌면 화면이 다시 그려진다.
setState() 리액트의 함수형 컴포넌트내에서 상태를 관리하기 위해 사용되는 hooks인 useState()를 통해 반환되는 함수로 컴포넌트의 state 객체에 대한 업데이트를 실행합니다. state가 변경되면, 컴포넌트는 리렌더링된다.
class Habit extends Component {
state = {
count: 0,
};
handleIncrement = () => {
this.setState({count: this.state.count + 1});
console.log(this.state.count);
}
render() {
return <button onClick={this.handleIncrement}></button>
}
}