classStateExampleextendsComponent{ constructor(props) { super(props); //state 정의 //forceUpdate 사용시 this.loading=true; 와 같이 직접선언 this.state = { loading: true, formData: 'no data', }; this.handleData = this.handleData.bind(this); //함수로 넘어갈 this는 반드시 생성자에서 bind로 묶어야함 setTimeout(this.handleData, 3000); //3초 후 저장된 값을 변경 }
handleData() { const data = 'new data'; const { formData } = this.state; //특수변수 this.state를 사용하여 state값에 접근 //setState가 호출되면 자동으로 render함수가 호출됨 //직접 변경하고 검증없이 강제로 render함수를 실행하고 싶다면 //this로 접근해서 직접 바꾸고 this.forceUpdate() 사용 //but render에서의 접근은 this.state.data가 아닌 this.data로 접근 // this.loading = false; // this.formData = data + this.formData; // this.forceUpdate();
//setState 함수의 인자로 함수를 전달하면 이전 state값을 쉽게 읽을 수 있음 handleData2(data) { this.setState((prevState) => ({ loading: false, formData: data + prevState.formData, })); }
setState()가 실행되면 검증 단계 후 자동으로 render()를 실행시키므로 별도의 새로고침 없이도 동적인 페이지에서 값이 바뀐다. 검증 단계를 거치기 싫고 강제로 값을 바꿔 새로고침을 만들고 싶다면 forceUpdate()를 사용하면 되는데, 자세한 설명은 위 코드 내에 주석으로 해놓았다.
그리고 중요한 것은, 함수로 넘어갈 this는 반드시 생성자 constructor에서 bind() 함수로 묶어주어야 한다.
이전 상태와 함께 사용하기
상태를 바꿀 때 이전 상태가 필요한 경우가 있다. count를 1씩 증가시키는 예제로 살펴보자.