state : 컴포넌트 내부에서 바뀔 수 있는 값
import React, {Component} from 'react';
class Counter extends Component {
constructor(props) {
super(props);
this.state = {
number : 0
};
}
render() {
const {number} = this.state;
//state 를 조회하기 위해선 this.state로 조회함.
return (
<div>
<h1>{number}</h1>
<button
onClick{() => {
//this.setState를 통해서 state에 새로운 값을 넣을 수 있다.
this.setState({number : number + 1});
}}
>
+1
</button>
</div>
);
}
}
export default Counter;
<코드가 하는 역할>
컴포넌트 생성자 메서드로 클래스형 컴포넌트에서 constructor를 작성할 때 반드시 super(props)를 호출해주어야한다.
constructor(props) {
super(props);
this.state = {
number : 0
};
}
fixedNumber 값은 그대로 두고 number 값만 바꿀 예정이다.
→ this.setState 함수는 인자로 전달된 객체 안에 들어있는 값만 바꿔 준다.
import React, {Component} from 'react';
class Counter extends Component {
constructor(props) {
super(props);
//state 초기값 설정
this.state = {
number : 0,
fixedNumber : 0
};
}
render() {
const { number, fixedNumber } = this.state;
return (
<div>
<h1>{number}</h1>
<h2>바뀌지 않는 값 : {fixedNumber}</h2>
<button
onClick={() => {
this.setState({number : number + 1});
}}
>
+1
</button>
</div>
);
}
}
export default Counter;
constructor 메서드를 따로 선언하지 않아도 state초기값을 설정할 수 있다.
import React, {Component} from 'react';
class Counter extends Component {
state = {
number : 0,
fixedNumber : 0
};
render() {
const {number,fixedNumber} = this.state;
return (...) //(...) 은 위에있는 코드와 동일.
}
}
export default Counter;
this.setState를 사용하여 state값을 업데이트할 때는 상태가 비동기적으로 업데이트 된다.
해결책 : this.setState를 사용할 때 객체 대신 함수를 인자로 넣어주어야한다.
this.setState((prevState,props) => {
return {
//업데이트하고싶은 내용
}
})
//prevState = 기존상태 ,
props = 현재 지니고 있는 props를 가리킨다.(불필요하다면생략 가능)
기존코드를 this.setState에 객체대신 함수 인자로 전달
=> 이는 버튼을 클릭하면 +2씩 숫자가 올라간다.
<button
onClick{() => {
this.setState(prevState => {
return {
number : prevState.number + 1
};
});
//위 코드와 아래 코드는 동일한 기능을한다.
//아래코드는 함수에서 바로 객체를 반환한다는 의미
this.setState(prevState => ({
number : prevState.number +1
}));
}}
>
+1
</button>
<button
onClick{ () => {
this.setState(
{
number : number + 1
},
() => {
console.log('방금 setState가 호출되었습니다.');
console.log(this.state);
}
);
}}
>
+1
</button>
→ 배열 안에 있는 값을 쉽게 추출해주는 문법
const array = [1,2];
const [one,two] = array;
import React, {useState} from 'react';
const say = () => {
const [message,setMessage] = useState('');
const onClickEnter = () => setMessage('hello');
const onClickLeave = () => setMessage ('bye');
return (
<div>
<button onClick = {onClickEnter}입장</button>
<button onClick = {onClickLeave}퇴장</button>
<h1>{message}</h1>
</div>
);
};
export default Say;
import React, {useState} from 'react';
const Say = () => {
const [message,setMessage] = useState('');
const onClickEnter = () => setMessage('Hi');
const onClickLeave = () => setMessage('Bye!');
const [color,setColor] = useState('black');
return (
<div>
<button onClick={onClickEnter}>Enter</button>
<button onClick={onClickLeave}>Exit</button>
<h1 style{{color}}>{message}</h1>
<button style = {{color:'red'}} onClick={() => setColor('red')}>
Red
</button>
<button style = {{color:'green'}} onClick= {() => setColor('green')}>
Green
</button>
<button style = {{color:'blue'}} onClick = {() => setColor('blue')}>
Blue
</button>
</div>
);
};
export default Say;
state 값을 바꾸어야할 때는 ①배열이나 객체 사본을 만들고 사본에 값을 업데이트 한 후 ②setState 혹은 useState를 통해 전달 받은 setter 함수를 사용해야한다.
//사본을 만들어서 업데이트하는 예시
const object = {a:1, b:2, c:3};
const nextObject = {...object, b:2}; //사본을 만들어서 b값만 덮어쓰기
//배열 다루기
const array = [
{id : 1, value : true},
{id : 2, value : true},
{id : 3 , value : false}
];
let nextArray = array.concat({id:4}); // 새항목 추가
nextArray.filter(item => item.id !==2); //id가 2인 항목 제거
nextArray.map(item => (item.id === 1 ? {...item, value : false} : item));
//id가 1인 항목의 value를 false로 설정
... : spread 연산자
객체에 대한 사본을 만들 때 spread 연산자라고 불리는 ...을 사용하여 처리하고, 배열에 대한 사본을 만들 때는 배열 내장함수를 활용한다.