# TIL-20210329
# react 비동기 처리
비동기 처리를 처음 다루는 방식으로 접근해본다.
dipatch같은 스토어 형태의 비동기 서버통신이 아닌 컴포넌트 단위의 비동기 처리를 구현한다.
# 적용 과정
- 비동기 데이터가 필요한 컴포넌트를 찾는다.
프로덕트 구조에 맞춰서 비동기 데이터가 필요한 컴포넌트를 정하고 해당 컴포넌트의
state
로 설정한다. - 비동기 처리의 트리거가 될 이벤트를 정의한다. 예를 들어 인터넷 쇼핑을 이용한다고 생각해보면,
- 검색어 입력
- 검색 시작
- 검색어에 해당되는 쇼핑 리스트 받아오기
- 화면에 보여주기
이 과정에서는 비동기처리는 검색 시작을 요청하는 경우이다.
보통은 검색 버튼이 클릭 되었을 때라고 생각 해볼 수 있다.
- 비동기 통신 구현
// App.js (class Component)
//...
this.state = {
list:[]
}
//...
handleSearch (queryString) {
// 특정 비동기 처리를 완료하면
this.state({list: '검색 결과 리스트'})
}
위와 같은 과정을 통해 리스트 state
를 변경하게 된다.
비동기처리는 web client의 내장 mothod
인 fetch
를 이용했다.
// 비동기 처리
const api = `https://데이터를 받아오려고 하는 api endpoint + 검색에 필요한 ${queryString}`
fetch(api) // 비동기 서버 통신
.then(res => res.json()) // json parsing
.then(data => { // data는 우리가 받아오려는 아이템 품목 리스트
this.state({list: data})
})
- 핸들러를 트리거 이벤트에 콜백 설정
// App.js
// ...
<Search handlerSearch={this.handlerSearch} />
// ...
// Search.js (class Component)
// ...
constructor(props) {
super(props)
this.state = {
queryString:''
}
// ... method 바인딩
}
handlerInput(e) {
this.setState({queryString:e.target.value})
}
render() {
return (
// ...
<input type="text" onChange={this.handlerInput} value={this.state.queryString}/>
<button onClick={() => { this.props.handlerSearch(this.state.queryString)}}>검색</button>
// ...
)}
// ...
Search Component
에서 핸들러를 실행 할 수 있도록 App Component
에서 props
로 내려준다.
buuton
엘리먼트의 onClick
이벤트 콜백을 통해 받은 handlerSearch
를 실행한다.
결과적으로 Search
에서의 액션이 App
의 상태를 변경할 수 있게 된다.
비동기 처리의 결과를 통해 this.setState
를 실행하기 때문에, 통신이 성공적이라면 항상 새로운 list
를 받게 된다.