변수가 아닌 자료를 저장할 때 쓰는 state
state쓰는 방법
import logo from './logo.svg';
import './App.css';
import { useState } from 'react';
function App() {
let post = '강남 우동 맛집';
let [a, b] = useState('남자 코트 추천');
위와 같이 사용하면 됨.
- useState를 사용한다.
- 뽑아내어 사용한다.(distrcuturing)
구조분해 할당… 아니까 넘어갈게..
그래서 useState의 return 값은 결론적으론 [‘남자 코트 추천’, 함수] 이렇게 넘어오는 것임.
state 왜 쓸까?
갑자기 글자가 변경이 되었다면, 새로운 글자를 가져왔거나…
변경이 제대로 되지 않을 수 있음. state 는 값이 바뀌면 재렌더링이 자동으로 된다.
vue에서는 기본적으로 v-bind로 잡아주면 알아서 변경 되었다 그 차이임.
자주 변경될 것 같은 애들은 state를 사용해라.
이벤트 핸들러 사용법
<h4>{title[0]} <span onClick={함수이름}>👍</span> {good[0]} </h4>
on click 옆에는 함수 이름만 올 수 있음
state 변경하는 방법
<h4>{title[0]} <span onClick={clkGood(0)}>👍</span> {good[0]} </h4>
function clkGood(index) {
good[index]++;
}
그러면 이렇게 두고
저 span 태그 눌러보면 좋아요 숫자가 올라가지 않음.
state 변경하는 방법은 따로 있음. state 변경할 때는 등호로 변경할 수 없음!
아래와 같이 코딩하면 된다.
import './App.css';
import { useState } from 'react';
function App() {
let [logo, setLogo] = useState('리액트 블로그');
let [title, setTitle] = useState(['남자 코트 추천', '파이썬 강의 정리', '리액트 강의']);
let [good, setGood] = useState([0, 0, 0]);
return (
<div className="App">
<div className="black-nav">
<h4>{logo}</h4>
</div>
<div className="list">
<h4>{title[0]} <span onClick={() => {
let copy = [...good];
copy[0] = copy[0] + 1;
setGood(copy);
}}>👍</span> {good[0]} </h4>
<p>2월 17일 발행</p>
</div>
<div className="list">
<h4>{title[1]} <span>👍</span> {good[1]} </h4>
<p>2월 17일 발행</p>
</div>
<div className="list">
<h4>{title[2]} <span>👍</span> {good[2]} </h4>
<p>2월 17일 발행</p>
</div>
</div>
);
}
export default App;
여기서 알아야하는 동작원리 두번째는 state 업데이트 해줄 때 복사본을 만드는 이유 (spread 문법 사용)
let copy = [...good];
copy[0] = copy[0] + 1;
setGood(copy);
state는 업데이트 해줄 때, 업데이트 전 <=> 업데이트 후가 같은 지 확인하고 완전히 같으면 아예 업데이트를 안함.
array의 경우 얕은 복사가 되어 다 target까지 동일하게 변경되므로 깊은 복사를 사용해야 함.