오늘은 React state와 props에 대해 블로깅을 진행해보려한다. 그럼 이번 글도 화이팅!
일상 생활 중 state와 props의 예를 들어보자면 아래와 같다.
state는 컴포넌트 내부에서 변경 할 수 있는 값이다. 특정 변수의 상태로, 클릭 시 1씩 증가하는 변수 count의 값은 state라고 볼 수 있다.
React에서 state를 다루는 방법 중 하나로 useState
라는 함수를 사용한다. 다음과 같이 useState
함수를 import한다.
`import { useState } from 'react'
이후 useState 함수를 컴포넌트 내부에서 호출한다. 일반적인 변수는 함수의 종료와 함께 사라지지만 state 변수는 함수가 끝나도 사라지지 않는다. 다음의 코드처럼 구조 분해 할당을 통해 state 변수와 state 변경함수를 선언해준다.
const countExample = () => {
// count는 state 변수명, addCount는 state 변경함수, useSatate(0)은 state 변수의 초기값
const [count, addCount] = useState(0)
}
state 갱신을 위해서는 위에서 선언해준 addCount 함수를 이용하면 된다. 이번에는 count의 값이 1씩 증가시키는 함수를 작성해보자.
... 생략 ...
return(
<div className='countExample'>
<p>count</p>
// onClick 함수 내부에 addCount를 호출하는 함수를 정의해줬다.
<button onClick={() => addCount(count++)}>addCount</button>
</div>
)
정상적으로 동작하는 것을 볼 수 있다.
props의 특징은 다음과 같다.
만약 props의 값이 읽기전용이 아니라면, 자식 컴포넌트에서 props의 값을 변경했을 시 의도치 않은 부모 컴포넌트의 값에 영향을 미칠 수 있다.
props 사용법은 다음과 같이 3단계 순서로 나눌 수 있다.
사용법에 따라 간단히 코드를 작성해 보자.
const Parent = () => {
return(
<div className = "parent">
// 자식 컴포넌트의 속성으로 넘겨줄 데이터를 작성한다.
<Child githubLink={'https://github.com/0scar0421'}/>
</div>
)
}
// 함수에서 인자를 전달 받았을 때와 동일하게 사용한다.
const Child = (props) => {
return(
// 전달 형식은 객체 형식이다. {key: value}
<div className = "child">
// 두 코드의 결과는 동일하다.
<a href={props.githubLink}>github</a>
<a href={props['githubLink']}>github</a>
</div>
)
}
다음 코드는 props.children로 props를 사용하는 방법이다.
// 자식 컴포넌트태그 사이에 넘겨줄 값을 작성한다.
<Child>'https://github.com/0scar0421'</Child>
// 함수에서 인자를 전달 받았을 때와 동일하게 사용한다.
<a href={props.children}>github</a>
<a href={props['children']}>github</a>
다음과 같이 여러개의 값을 넘겨 줄 수있다.
const propsData = {
link: 'https://github.com/0scar0421',
text: 'oscar\'s github'
}
// 부모 컴포넌트 내부
<Child>{propsData}</Child>
// 자식 컴포넌트 내부
<a href={props.children.link}>github</a>
<p>{props.children.text}</p>
기본적으로 React의 이벤트 핸들링은 DOM의 이벤트 처리 방식과 유사하지만, 몇 가지 문법 차이가 있다.
예를 들자면 다음과 같다.
// html에서의 이벤트 핸들링
<button onclick='handleEvent()'>Event</button>
//React에서의 이벤트 핸들링
<button onClick={handleEvent}'>Event</button>
여러가지 이벤트 핸들러 중 2가지의 핸들러를 알아보자.
input
textarea
select
와 같은 form 엘리먼트는 사용자의 입력값을 제어하는데 사용된다, React는 이러한 변경될 수 있는 입력값을 일반적으로 컴포넌트의 state로 관리한다. const NameForm() = {
const [name, setName] = useState('');
return(
<div>
<input type='text' value={name} onChange={(e) => setName(e.target.value)} />
<p>{name}</p>
</div>
)
}
onClick
은 사용자가 클릭이라는 행동을 하였을 때 발생한다. 버튼이나 <a>
태그를 통한 링크 이동 등과 같은 상황에서 발생한다.const ClickEvent() = {
return(
<button onClick={() => console.log('clicked!!')}
)
}
바닐라 자바스크립트에서는 변수 값의 변경이 일어나면 직접 DOM에서 수정해 반영 해줘야했다. 하지만 리액트에서는 state로 변수의 상태를 관리하여 변수 값이 변하더라도 별도의 코딩없이 변수 값을 변경해주니 큰 일이 하나 줄었다는 느낌을 받았다.
리액트의 기능을 하나하나 배울때마다 성장하는 것 같아 기분이 좋다.