- Hook의 개념을 설명할 수 있고, 상황에 따라 알맞은 Hook을 사용할 수 있다.
- props의 개념에 대해 한 문장으로 설명할 수 있다.
- state의 개념에 대해 한 문장으로 설명할 수 있다.
- useState hook을 사용하여 함수 컴포넌트의 상태를 관리할 수 있다.
- state를 이용해서 UI의 변경을 표현할 수 있다.
- 이벤트를 통해 state를 변경할 수 있다.
- props의 개념을 이용해 부모 요소의 state를 자식 요소에서 반영시킬 수 있다.
- props의 개념을 이용해 자식에서 일어난 이벤트로 부모의 state 값을 바꿀 수 있다. (state 끌어올리기)
💻 Hook의 정의
Hook
은 클래스 컴포넌트에서만 사용할수 있었던 state(상태)관리와 lifecycle(라이프사이클) 관리 기능을 함수 컴포넌트에서도 사용할 수 있도록 연동해주는 함수를 의미. 이러한 Hook의 모음을 Hooks라고 한다.💻 Hook의 특징
💻 함수 컴포넌트 내에서 호출
Hook을 호출할 수 있는 곳은 다음과 같다.
위 두 가지 경우를 제외한 곳에서는 Hook을 호출할 수 없다.
💻 최상위에서 호출
{}
내부를 의미. 만약 첫 번째 {}
내부가 아닌 if문, 반복문 등의 중첩되는 코드 블락 {}
안에서 호출하게 되면 에러 발생Props란 컴포넌트 속성값을 의미하며, 부모컴포넌트로부터 전달받은 데이터를 지니고 있는 객체.
💻 부모 컴포넌트에서의 데이터 전달
<Child />
컴포넌트를 return문 내에 삽입.pet={animal}
과 같이 자식 컴포넌트에 속성값 추가(pet
은 자식 컴포넌트에서 데이터를 받을 때 사용되는 인식표)// Parent.js(부모 컴포넌트)
import React from 'react';
import Child from './Child';
const Parent = () => {
const animal = '호랑이';
return (
<>
<h1>부모 컴포넌트입니다.</h1>
<p>{animal}</p>
<Child pet={animal} englishName="tiger" />
</>
);
};
export default Parent;
💻 자식 컴포넌트에서의 전달 받은 데이터 적용
const Child = (매개변수) ⇒ {}
와 같이 부모 컴포넌트에서 보내준 데이터를 받아서 사용const Child = (props) ⇒ {}
라고 매개변수 이름을 짓는 것이 컨벤션구조분해 할당 : 구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식
// Child.js(자식 컴포넌트)
import React from 'react';
const Child = (props) => {
console.log(props); // {pet: '호랑이', englishName: 'tiger'}
return (
<>
<h2>자식 컴포넌트입니다.</h2>
<p>{props.pet}</p> // 호랑이
<p>{props.englishName}</p> // tiger
</>
);
};
export default Child;
// Child.js(자식 컴포넌트)
import React from 'react';
const Child = ({pet, englishName}) => {
console.log(props); // {pet: '호랑이', englishName: 'tiger'}
return (
<>
<h2>자식 컴포넌트입니다.</h2>
<p>{pet}</p> // 호랑이
<p>{englishName}</p> // tiger
</>
);
};
export default Child;
state
란 컴포넌트 내부에서 가지고 있는 컴포넌트의 상태값을 의미💻 State 선언
const [state, setState function] = useState(defaultValue)
💻 State 적용
backgroundColor: color
와 같이 미리 선언한 state 값을 넣어줌// Main.js
import React, { useState } from 'react';
const Main = () => {
const [color, setColor] = useState('red'); // 4 ~ 5
return (
<h1 style={{ backgroundColor: color }}>여기는 메인페이지입니다.</h1> // 1 ~ 3
);
};
export default Main;
{()=>{setColor('blue')}}
아니라면 함수이름만 작성{setColor}
// Main.js
import React, { useState } from 'react';
const Main = () => {
const [color, setColor] = useState('red');
return (
<>
<h1 style={{ backgroundColor: color }}>여기는 메인페이지입니다.</h1>
<button onClick={() => setColor('blue')}>색상 바꾸기</button>
</>
);
};
export default Main;
💻 State 전달
state로 관리하고 있는 color값
을 color라는 이름으로 넘겨주고, state값을 업데이트하는 함수 setColor
는 chageColor함수를 만들어서 change라는 이름으로 넘겨줌// Parent.js (부모 컴포넌트)
import React, { useState } from 'react';
import Child from './Child';
const Parent = () => {
const [color, setColor] = useState('red');
const changeColor = () => {
setColor('blue');
};
return (
<>
<div>부모 컴포넌트입니다.</div>
<Child color={color} change={changeColor} />
</>
);
};
export default Parent;
💻 State 적용
자식 컴포넌트인 Child는 props를 통해서 state 값인 color와 color 값을 업데이트 시킬 수 있는 함수를 받아옴.
props 객체로 감싸져 있기 때문에 부모 컴포넌트로부터 받아온 상태값을 사용하고 싶을 때는 props.color로, 그 값을 클릭 이벤트를 통해 업데이트 함수를 실행시키고 싶다면 클릭 이벤트 핸들러에 props.change를 연결해 실행
// Child.js (자식 컴포넌트)
import React from 'react';
const Child = (props) => {
console.log(props); // {color: 'red', change: () => {setColor('blue')}}
return (
<>
<div>자식 컴포넌트입니다.</div>
<p>{props.color}</p>
<button onClick={props.change}>색상 바꾸기</button>
</>
);
};
export default Child;
유저가 자식 컴포넌트에 있는 “색상 바꾸기”라는 버튼을 누르면 실행되는 함수는 부모 컴포넌트 내에 있는 setColor 함수
state는 선언된 곳에서 업데이트가 되어야 하지만 이처럼 props를 이용해서 state 끌어올리기를 한다면, 자식 컴포넌트에서도 원하는 상태값을 제어할 수 있다.