Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
- constructor
1-1. state는 여기에 둘게 끝.- Render : state에 인포메이션 있어?
2-1. 아 뭐 있구나, 그럼 바로 state에 있는 정보 가져갈게. component에 뿌리는 함수(4) 실행시킬게 끝.
2-2. 뭐 없네? 일단 loading 페이지 render 시킬게 끝.- componentDidMount: render 끝나면 그럼 새롭게 fetch해서 인포메이션에 넣어줄게(5). 끝.
- 인포메이션을 component에 뿌리기: state 가져와서 map을 이용해서 component에 뿌려줄게 끝.
- 새롭게 fetch해서 인포메이션에 넣기: 나는 순서가 중요한 함수야(async)
5-1. 새롭게 정보가 필요해? 그럼 fetch하는 함수 불러서 값 가져올게(6) 니가 완료되어야 그 값을 가지고(await) 다음 내용을 실행할 수 있어.
5-2. 그리고 그 값을 setState 해서 state에 넣어 주겠어(7) 끝.- fetchApi: query나 상세 요청 내용 주면 fetch api로 response 가져다 줄게. 혹시 에러나면 에러 알려줄게. 끝.
- response로 정보 받아서 setState하기 : response 전달해주면 setState(8) 할게. 끝.
- setState: state가 변경되었어? 그럼 비교해보고 다시 render(2)해야겠다. 끝.
class App extends React.Component {
constructor() {
super();
this.state = JSON.parse(localStorage.getItem("state"));
this.titleClickHandle = this.titleClickHandle.bind(this);
this.inputChangeHandle = this.inputChangeHandle.bind(this);
this.searchClickHandle = _.debounce(this.searchClickHandle.bind(this), 2000);
this.laterClickHandle = this.laterClickHandle.bind(this);
this.closeClickHandle = this.closeClickHandle.bind(this);
}
componentDidMount() {
const defaultInfo = {
query: "여락이들",
max: 5,
key: YOUTUBE_API_KEY
};
searchYouTube(defaultInfo, items => {
this.setState({
videos: items,
currentVideo: items[0]
});
});
}
// 비디오 제목 클릭 시
titleClickHandle() {
const clickedTitle = event.target.textContent;
let chosenVideo;
for (let video of this.state.videos) {
if (video.snippet.title === clickedTitle) {
chosenVideo = video;
}
}
this.setState({
currentVideo: chosenVideo
});
}
// watch later 버튼 클릭 시
laterClickHandle() {
const clickedVidId = event.target.id;
let chosenVideo;
for (let video of this.state.videos) {
if (video.id.videoId === clickedVidId) {
chosenVideo = video;
}
}
if (this.state.laterVideos.includes(chosenVideo)) {
alert("you ALREADY have the video in the Watch Later List!");
} else {
this.setState({ laterVideos: [...this.state.laterVideos, chosenVideo] });
}
}
// close 버튼 클릭 시
closeClickHandle() {
const clickedVidId = event.target.id;
let chosenVideo;
for (let video of this.state.laterVideos) {
if (video.id.videoId === clickedVidId) {
chosenVideo = video;
}
}
this.setState({
laterVideos: this.state.laterVideos.filter(video => {
return video !== chosenVideo;
})
});
}
// 검색어 입력 시 - 실시간 검색
inputChangeHandle() {
const inputVal = event.target.value;
this.setState({ currentInput: inputVal });
this.searchClickHandle();
}
// 검색버튼 클릭
searchClickHandle() {
if (this.state.currentInput.includes('"')) {
return null;
}
const searchInfo = {
query: this.state.currentInput,
max: 5,
key: YOUTUBE_API_KEY
};
searchYouTube(searchInfo, items => {
if (items.length !== 0) {
this.setState({
videos: items,
currentVideo: items[0]
});
}
});
}
render() {
if (!this.state.currentVideo) {
console.log("loading");
return <div>Loading</div>;
}
localStorage.setItem("state", JSON.stringify(this.state));
return (
<div>
<Nav
inputChangeHandle={this.inputChangeHandle}
searchClickHandle={this.searchClickHandle}
/>
<div id="contents">
<div id="video-area">
<div className="col-md-7">
<div>
<VideoPlayer
video={this.state.currentVideo}
laterClickHandle={this.laterClickHandle}
/>
</div>
</div>
<div className="col-md-5 overflow">
<div>
<VideoList
videos={this.state.videos}
titleClickHandle={this.titleClickHandle}
laterClickHandle={this.laterClickHandle}
/>
</div>
</div>
</div>
<div>
<div className="watch-later-list">
<div className="watch-later-list-title">Watch Later</div>
<WatchLaterList
laterVideos={this.state.laterVideos}
titleClickHandle={this.titleClickHandle}
closeClickHandle={this.closeClickHandle}
/>
</div>
</div>
</div>
</div>
);
}
}