Hook은 React 버전 16.8부터 React 요소로 새로 추가되었습니다. Hook을 이용하여 기존 Class 바탕의 코드를 작성할 필요 없이 상태 값과 여러 React의 기능을 사용할 수 있습니다.
선택적 사용 : 기존의 코드를 다시 작성할 필요 없이 일부의 컴포넌트들 안에서 Hook을 사용할 수 있습니다. 그러나 당장 Hook이 필요 없다면, Hook을 사용할 필요는 없습니다.
100% 이전 버전과의 호환성 Hook은 호환성을 깨뜨리는 변화가 없습니다.
현재 사용 가능 Hook은 배포 v16.8.0에서 사용할 수 있습니다.
state : 상태
단어 뜻 그대로 컴포넌트 내부에서 가지고 있는 컴포넌트의 상태값 입니다.
state는 화면에 보여줄 컴포넌트의 UI 정보(상태) 입니다.
state는 컴포넌트 내에서 정의하고 사용하며 얼마든지 데이터가 변경될 수 있습니다.
함수 컴포넌트에서 state, 즉 해당 컴포넌트의 상태를 어떻게 정의할까
import React, { useState } from 'react';
function State() {
const [color, setColor] = useState('red');
return (
<div>
<h1>Function Component | State</h1>
</div>
);
}
export default State;
return
문 안에 들어있습니다.useState
함수를 import한 후 사용해야 합니다.useState
함수에 초기값 ('red')을 인자로 넣어 호출하면 배열을 반환합니다.color
로, color의 값을 갱신하는 함수를 setColor
로 그리고 color의 초기값을 red
로 정의했습니다.state에서 상태값을 설정하는 이유는 결국 컴포넌트 안의 요소에는 그 상태값을 반영해서 데이터가 바뀔 때마다 효율적으로 화면(UI)에 나타내기 위함입니다.
return
문 안에 <h1>
타이틀 요소가 있습니다.<h1 style = {{color : color }}>Function Component State</h1>
// key값 color는 색상을 부여하기 위한 속성
// value값 color는 useState 함수를 통해 초기값인 'red'를 담고 있는 변수
위의 예시에서 볼 수 있듯이, state에서 상태값을 설정하는 이유는 결국 컴포넌트 안의 요소에서 그 상태값을 반영해서 화면(UI)에 나타내기 위함입니다.
import React, { useState } from 'react';
function State() {
const [color, setColor] = useState('red');
return (
<div>
<h1 style={{ color: color }}>Function Component | State</h1>
<button onClick={() => setColor('blue')}>Click</button>
</div>
);
}
export default State;
<h1>
태그 아래에 <button>
요소를 추가해주었습니다.
button
요소에서onclick
이벤트 발생- color라는 상태값을 갱신하는 함수,
setColor
함수 실행- setColor 함수를 실행시키면서 인자로 넘겨준 값 'blue'에 의해 color의 값이 'red'에서 'blue'로 변경
- 상태값이 바뀌게 ㄷ되면서 함수 컴포넌트가 다시 render 되고 바뀐 state 값을 반영하여
<h1>
태그 글자 색상 변경
props : properites (속성)
단어 뜻 그대로 컴포넌트의 속성값입니다.
props는 부모 컴포넌트로부터 전달 받은 데이터를 지니고 있는 객체입니다.
props를 이용해 어떤 자바스크립트 값이든 모두 자식 컴포넌트에 전달할 수 있습니다. (변수, state 값, event handler 등)
// Parent.js
import React, { useState } from 'react';
import Child from '../pages/Child/Child';
function Parent() {
const [color, setColor] = useState('red');
return (
<div>
<h1>Parent Component</h1>
<Child titleColor={color}/>
</div>
);
}
export default Parent;
Parent.js
부모 컴포넌트 입니다.titleColor
속성을 생성해주었습니다. titleColor
의 값으로 color
, 즉 부모 컴포넌트의 state인 color
값을 전달해주었습니다.<Child />
컴포넌트 내부에서 전달 받은 props 데이터를 어떻게 사용하는지 확인해보겠습니다.// Child.js
import React from 'react';
function Child(props) {
// console.log(props);
return (
<div>
<h1 style={{color : props.titleColor}}>Child Component</h1>
</div>
);
}
export default Child;
Child.js
내부에서 props 객체가 어떻게 생겼는지 확인해보도록 하겠습니다.// Child.js
import React from 'react';
function Child(props) {
// console.log(props);
return (
<div>
<h1 style={{color : props.titleColor}}>Child Component</h1>
</div>
);
}
export default Child;
<Child />
컴포넌트 내부에 <h1>
태그가 있습니다.return
문 위에서 props
값을 console.log
로 확인합니다.// Parent.js
import React, { useState } from 'react';
import Child from '../pages/Child/Child';
function Parent() {
const [color, setColor] = useState('red');
return (
<div>
<h1>Parent Component</h1>
<Child titleColor={color} changeColor={() => setColor('blue')} />
</div>
);
export default Parent;
changeColor
값으로 Parent 함수에서 정의한 setColor
함수 자체를 넘겨주고 있습니다.<Child />
컴포넌트에서 어떻게 props로 전달받은 handleColor
함수를 활용하는지 살펴보겠습니다.// Child.js
import React from 'react';
function Child(props) {
return (
<div>
<h1 style={{color : props.titleColor}}>Child Component</h1>
<button onClick={props.changeColor}>Click</button>
</div>
);
}
export default Child;
<Child />
컴포넌트 내부에 <button>
태그가 있습니다.
<button>
요소에서onClick
이벤트 발생
이벤트 발생시props,changeColor
실행
props 객체의changeColor
, 즉 부모 컴포넌트로부터 전달받은setColor
함수 실행
setColor
함수 실행 시 state의color
값이blue
로 변경
<Child />
컴포넌트에 변경된 state 데이터color
전달
props.titleColor
를 글자 색상으로 지정하는<h1>
타이틀 색상 변경