6-1. Basic
- state는 컴포넌트 내부에서 바뀔 수 있는 값 의미
- props는 부모 컴포넌트가 설정하는 값이지만, state는 컴포넌트 내부에서 설정되는 값
- props는 읽기 전용으로 사용되지만, state는 변경되는 값을 관리
- 클래스형 컴포넌트에서는 state를 직접 사용할 수 없음
- 함수형 컴포넌트에서는 useState라는 hooks로 별도 기능 제공
class Counter extends React.Component{
constructor(props){
super(props);
this.state = {
number : 0
};
}
render(){
const { number } = this.state;
return(
<>
<h1 style={ number < 0 ? {color : 'tomato'} : {color : 'orange'} }>Count : {number} </h1>
<button onClick={ () => this.setState({ number : number - 1 })}>-1</button>
<button onClick={ () => this.setState({ number : number + 1 })}>+1</button>
</>
);
}
}
ReactDOM.createRoot(document.getElementById('root')).render(<Counter/>);
6-2. PrevState
- this.state를 사용할 시 상태가 변경 되고 리렌더링이 되어야 state 값 변경 적용
- 하나의 이벤트 핸들러에서 여러번 setstate를 호출한다고 누적 갱신 되지 않음
- 이 때, state 객체 대신 함수를 인자로 전달하여 첫번째 인자 prevState, 두 번째 인자 props를 활용 가능
- 만약 props가 필요하지 않은 상황이면 생략 가능
class Counter extends React.Component{
state = {
number : 0
};
render(){
const { number } = this.state;
return(
<>
<h1 style={ number < 0 ? {color : 'tomato'} : {color : 'orange'} }>Count : {number} </h1>
<button onClick={ () => this.setState({ number : number - 1 })}>-1</button>
<button onClick={ () => {
this.setState((prevState, props) => {
return {
number : prevState.number + 1
};
});
this.setState(prevState => ({ number : prevState.number + 1 }));
}}>+1</button>
</>
);
}
}
ReactDOM.createRoot(document.getElementById('root')).render(<Counter/>);
6-3. After set State
class Light extends React.Component {
state = {
isOn : false
};
render() {
const { isOn } = this.state;
const style = {
width : 200,
height : 200,
backgroundColor : isOn ? 'green' : 'red',
transition : '2s'
};
return (
<>
<div style={style}></div>
<button onClick={
() => this.setState(
{ isOn : !isOn },
() => console.log(isOn ? '불이 켜졌습니다' : '불이 꺼졌습니다')
)
}
>
{ isOn? 'OFF' : 'ON' }
</button>
</>
);
}
}
ReactDOM.createRoot(document.getElementById('root')).render(<Light/>);
6-4. Use State
- 함수형 컴포넌트에는 기본적으로 state를 사용할 수 없었지만, 리액트 16.8 버전 이후로는 useState 함수를 이용하여 함수 컴포넌트에서도 state 사용 가능
- useState는 React 객체 내부에 존재하는 함수형 속성
- React.useState() 형태로 호출해서 사용해야 하지만 구조분해 할당을 이용하여 미리 전역변수로 선언해두고 나면 React.를 생략하고 useState()로 사용 가능
const { useState } = React;
function Say(){
const [message, setMessage] = useState('기본 상태');
const [color, setColor ] = useState('black');
const [backgroundColor, setbackgroundColor] = useState('white');
const onClickEnter = () => setMessage('안녕하세요!');
const onClickLeave = () => setMessage('안녕히 가세요.');
return (
<>
<h1 style={ { color, backgroundColor} }>{ message }</h1>
<div>
<button onClick = { onClickEnter }>입장</button>
<button onClick = { onClickLeave }>퇴장</button>
</div>
<div>
<button onClick = { () => setColor('tomato')}>토마토색</button>
<button onClick = { () => setColor('orange')}>오렌지색</button>
<button onClick = { () => setColor('purple')}>보라색</button>
</div>
<div>
<button onClick = { () => setbackgroundColor('white')}> 기본 배경 </button>
<button onClick = { () => setbackgroundColor('black')}> 반전 배경 </button>
</div>
</>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<Say/>);