Wecode에서 첫 프로젝트 Westargram이 마무리 되었다.
클론 코딩하려고 인스타그램도 가입하고 2주 동안 여러 가지 배우면서 재밌던 시간이었다.
<div className="feeds">
{feed.map(feed => {
return(
<Feed key={feed.id}
user={feed.user}
userImg={feed.userImg}
feedImg={feed.feedImg}
isLike={feed.isLike}
like={feed.like}
storyName={feed.storyName}
story={feed.story}
/>
);
})}
</div>
React Component, map() 메소드 리얼 코딩 치트키
리액트 에러 피바다 화면 나올때마다 스파이더맨 모습 === 내모습
handleLike = () => {
this.setState({
isLike: !this.state.isLike
}, () => this.handleLikenumUp())
}
handleLikenumUp = () => {
if(this.state.isLike){
this.setState({
like: this.state.like + 1
})
} else {
this.setState({
like: this.state.like - 1
})
}
}
// JSX
<div className="feedImage">
<img alt="사진" src={feedImg} onDoubleClick={this.handleLike}/>
{ isLike &&
<div className="heart">
<i className="fas fa-heart"></i>
</div>
}
</div>
// SCSS
.heart {
position: absolute;
top: 100px;
left: 250px;
color: white;
font-size: 100px;
animation: imageHeart 1s;
animation-iteration-count: 1;
opacity: 0;
}
@keyframes imageHeart {
0% { transform: scale(0); opacity: 1}
50% { transform: scale(1); opacity: 1}
100% { transform: scale(1)}
}
}
handleInputChange = (e) => {
this.setState({
text: e.target.value,
}, () => this.commentBtnOnOff()
)}
commentBtnOnOff = () => {
if(this.state.text){
this.setState({
disabled: false
})
} else {
this.setState({
disabled: true
})
}
}
handleKeyPress = (e) => {
if(e.key === 'Enter') {
this.handleAddComment();
this.setState({
disabled: true
})
}
}
handleAddComment = () => {
const { commentList , user, text } = this.state
if(text){
this.setState({
commentList: [
...commentList,
{
id: commentList.length + 1,
userName: user,
content: text
}
],
text: ''
});
}
}
handleRemoveComment = (id) => {
const nextCommnets = this.state.commentList.filter(
(commnet) => {return commnet.id !== id})
this.setState({
commentList: nextCommnets
})
}
handleLikeComment = (id) => {
const nextLikedCommnets = this.state.commentList.map((comment) => {
if( comment.id === id) {
comment.isLiked = !comment.isLiked
}
return comment
})
this.setState({
commentList: nextLikedCommnets
})
}
어떻게 구현하면 좋을지 고민을 많이 했던 기능이다.
정규표현식을 조금 활용해보기로 했다.
검색 Input창 text가 입력되고 컴포넌트가 리렌더링 될때 입력 text가 포함된 데이터만 filter 되어 나타나도록 했다.
text 입력시에만 결과값이 렌더링되도록 조건부 렌더링을 적용했다.
render() {
const { feedList, text } = this.state
const filterData = feedList.filter( user => {
const regexp = new RegExp( text, 'ig')
return user.userName.match( regexp )
})
...
<input onChange={this.handleInputChange} value={text} type="text" placeholder="검색"/>
{ text.length > 0 &&
<ul className="searchList">
{
filterData.map(user => {
return(
<div className="filteredUser">
<img alt="사진" src={user.img}/>
<li>{user.userName}</li>
</div>
);
})}
</ul>
}
2주간 SNS 중독마냥 인스타그램 클론에 빠져 지낸거 같다.
HTML/CSS/JS를 React로 다시 만들어보면서 처음에 페이지들을 컴포넌트화 할때는 거의 화면이 뒤틀린 웹페이지 마냥 보이고 뭔가 된거 같다 싶으면 React가 바로 에러로 마중을 나와줘서 힘들었다.
그래도 하나씩 점차 구현해가면서 성취감도 들구 꽤 재밌었다.
동기들과 같이 하면서 의지만큼은 상한가를 찍은 거 같다.
계속 에러뜨구 반응없는.. 거의 숨이 멎어가는 코드를 동기들에게 보여 주면 같이 고민해주고 심폐소생술 해주는 제세동기 같은 동기들에게 너무 고마움이 크다.
에러가 300줄이 와도 동기들이랑 같이 부셔버릴수만 있다면..!
React랑도 아주 조금 친해진거 같지만 정말 좋은 녀석인거 같다.
이번에는 상당히 서툴게 구조를 짜고 코딩했지만 다음 프로젝트에서는 더 깊게 고민해보고 조금은 더 좋은 코드로 React를 활용해보도록 하겠다!
종진님! 맞은편에서 고뇌하는 모습 잘 봤습니다.. 이렇게 멋진 결과물을!! 그동안 코드카타 같이해서 즐거웠어요!😆