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/>);