Component의 사전적 정의는 독립적이고 재사용 가능한 코드 비트
이다. Javascript 함수와 동일한 목적을 제공하지만 분리되어 작동하고 HTML을 반환한다.
코드를 보면 다음과 같다.
<div className="box">
Box1
<p>I am Box</p>
</div>
<div className="box">
Box1
<p>I am Box</p>
</div>
기존에 같은 div를 만들려면 위 코드와 같이 하나하나 만들어 줘야했다. 하지만 react에선 코드하나로 재사용이 가능하다.
1. src > component > Box.js
파일을 생성 한다.
2. raface단축키를 사용하여 component를 만든다.
import React from 'react'
const Box = () => {
return (
<div className="box">
Box1
<p>i am Box</p>
</div>
)
}
export default Box
App.js
에 import Box from "./component/Box"
,<Box/>
선언해준다.import './App.css';
import Box from "./component/Box"
function App() {
return (
<div>
<Box/>
<Box/>
<Box/>
</div> //jsx 신택스에서 주의할점. 반드시 하나로 묶어야한다.
);
}
export default App;
결과는 i am Box div가 3개 생성이 되어 있다.
박스 안에 있는 내용을 바꾸고 싶다면 어떻게 해야할까?
1. App.js에 name값과 num값을 추가한다.
<div>
<Box name="i am Box1" num={1} />
<Box name="i am Box2" num={2} />
<Box name="i am Box3" num={3} />
</div>
import React from 'react'
const Box = (props) => {
return (
<div className="box">
Box{props.num}
<p>{props.name}</p>
</div>
)
}
export default Box
결과는 다음과 같다.
React
컴포넌트의 현재 상황에 대한 정보를 나타내기 위해 React
에서 사용하는 일반 Javascript
객체이다. state
는 함수에 선언된 변수와 마찬가지로 구성 요소에서 관리되지만 차이점은 "정상"변수는 함수가 종료될 때 "사라지는" 반면,state
는 React
에 의해 보존된다.
const
로 선언을 하게되면 변수의 값을 바꿀 수 없다는 사실을 알것이다. 근데 왜 state
값은 계속 바뀌는데 왜 let
이 아닌 const
로 선언하는가.
state
는 일반 변수와 달리 setState
함수를 이용하여 값을 변경한다.(이렇게 함수 내부의 변수가 함수 수명이 끝나더라도, 변수의 참조가 계속 된다면 그 변수의 수명은 계속 된다.)
그러나 let
을 사용하게 되면 conuter=100
과 같은 변수형식이 할당이 가능해진다.
따라서 이를 방지하고 setState
를 사용한 변수 변경만 허락하기 위해 const
로 선언한다.
이벤트 핸들러, 서버 응답 또는 소품 변경에 대한 응답으로 상태를 업데이트할 수 있다. 이것은 setState()
메서드를 사용하여 수행된다.setState()
메서드는 구성 요소 상태에 대한 모든 업데이트를 대기열에 넣고 React
에 업데이트된 상태로 구성 요소와 그 자식을 다시 렌더링 하도록 지시한다.
항상 setState()
메서드를 사용하여 상태 객체를 변경한다. 구성 요소가 업데이트 되었음을 알리고 render()
메서드를 호출하기 때문이다.
import { useState } from 'react';
import './App.css';
import Box from "./component/Box"
function App() {
let counter = 0;
const [counter2, setCounter2] = useState(0);
const increase = () => {
counter = counter + 1;
setCounter2(counter2 + 1);
}
return (
<div>
<div>{counter}</div>
<div>state:{ counter2}</div>
<button onClick={increase}>클릭!</button>
</div>
);
}
export default App;
위 코드는 쉽게 설명하면 다음과 같다. const [적용, 변경할 내용]
이다. 위 코드 내용을 리뷰하면 const [counter2, setCounter2] = useState(0);
처음에 counter2에 state값은 0으로 지정한다. let counter2 = 0
과 같다.
<button onClick={increase}>클릭!</button>
을 클릭하면 const increase =()=>{ setCounter2(counter2+1); };
함수가 실행되고, <div>state:{ counter2}</div>
counter2가 바뀌는데 counter2가 바뀌면서 state를 사용했기 때문에 자동으로 HTML에 랜더링이 돼 UI가 변경되는 것이다.
위 코드는 일반 javascript
와 useState
를 같이 사용한 코드이다.
위 코드 실행을 console.log
에 찍어보면 counter는 항상 1
이고 counter2는 계속 증가
한다.
이유는 실행순서때문이다.
1. 유저가 버튼을 클릭한다.
2. counter+1헤서 1이됨
3. setState함수호출
4. console.log 실행됨
- 변수값은 1로 보이고 state값은 아직 안변했기 때문에 그전에 값이 보인다.
5. 함수 끝
6. app 다시 re render
- let counter=0을 거치면서 counter 값은 다시 0으로 초기화가 된다.
- state값은 update가 되면서 다시 render 된다.
결국 변수는 render될때마다 초기화가 되고 state는 비동기처리가 된다.