-
글쓴이글
-
2021년 7월 7일 16:09 #11319
코린이참가자안녕하세요 선생님
도움 요청드립니다.
첫번째, 좋아요 기능 렉 문제
SNS를 만들었는데요. 좋아요 기능이 있습니다. 좋아요를 누르면 좋아요 갯수가 올라가고 좋아요를 누른 상태에서 다시 한번 더 누르면 취소가 됩니다. POST 방식으로 어떤 유저가 좋아요를 누르면 해당 게시물에 좋아요 수를 +1 해주고 좋아요를 누른 유저 (배열데이터)에도 해당 유저의 아이디를 push하고 취소를 하게 되면 좋아요 수-1 해주고 좋아요 누른 유저를 pull 하는 방식으로 구현했습니다.
그런데 5~6번 클릭하면 렉이 걸리는지 사이트가 멈춥니다. 어떻게 해결하면 좋을까요?
두번째, useEffect 무한루프 문제
Node js 게시판이지만... React랑 연동해서 하고 있어서 여기에다가 질문 올립니다.
useEffect의 무한루프 방지를 위해 useEffect 두번째 인자 배열에 state값을 넣었지만 페이지가 켜있는 상태에서 계속 재렌더링이 일어납니다...참고로 posts라는 state는 객체 형태입니다. 또한 서버에서 받아온 res.data도 객체 데이터입니다. res.data 객체 데이터를 받아서
posts state에 저장한 후 실시간으로 바뀌는건 posts.like 과 posts.comment 입니다.
const [posts, setPosts] = useState({});
useEffect(()=>{
axios.post("/detail/getpost",{id:id})
.then((res)=>{
console.log(posts);
setPosts(res.data);
}).catch((err)=>{
console.log(err);
})
},[posts]);app.post("/detail/like",loginCheck, function(req,res){
let id = parseInt(req.body.id);
db.collection("post").findOne({_id:id},function(error,result){
if(error) return console.log(error);
if(result.likeUser.includes(req.user.id)){
db.collection("post").updateOne({_id:id},{$inc:{like:-1}},function(error,result){
if(error) return console.log(error);
db.collection("post").updateOne({_id:id},{$pull:{likeUser:req.user.id}},function(error,result){
if(error) return console.log(error);
})
})
} else {
db.collection("post").updateOne({_id:id},{$inc:{like:1}}, function(error,result){
if(error) return console.log(error);
db.collection("post").updateOne({_id:id},{$push:{likeUser:req.user.id}},function(error,result){
if(error) return console.log(error);
})
})
}
})
})2021년 7월 7일 17:38 #11326
codingapple키 마스터1. 브라우저가 멈추는거면 리액트 코드를 확인해봐야하고 그냥 클릭이 반영이 안되는거면 서버문제일 수 있습니다 아마 ajax 요청이 끝나기도 전에 계속 요청해서 그런게 아닐까요
2. posts가 변경이 되면 useEffect 발동되고
useEffect안에서는 ajax요청 하고 요청성공시 posts를 변경해주고
posts가 변경이되면 useEffect 발동되고
useEffect안에서는 ajax요청 하고 요청성공시 posts를 변경해주고
이런 루프 같은데요
- 좋아요 버튼을 누르면 ajax요청으로 DB에 +1 해주고
- 그 게시물의 총 좋아요 갯수를 리액트 파일로 응답해줌
- 리액트파일에선 ajax성공시 딸려오는 총좋아요 갯수를 posts에 반영해줌
useEffect없이 이렇게만 짜도 될듯요?
그리고 데이터를 단순히 가져올 때는 post요청말고 get요청을 쓰는게 어떨까요
2021년 7월 7일 22:21 #11333
코린이참가자안녕하세요 쌤
답변 감사드립니다ㅠㅠ
1번 문제에 관한 리액트 코드는 아래와 같습니당
좋아요 함수
function like(){
axios.post("/detail/like",{id:posts._id})
.then((res)=>{
setPosts(res.data);
}).catch((err)=>{
console.log(err);
})
}좋아요 HTML
<p onClick={
like
>좋아요?{posts.like}</p>서버 코드
app.post("/detail/like",loginCheck, function(req,res){
let id = parseInt(req.body.id);
db.collection("post").findOne({_id:id},function(error,result){
if(error) return console.log(error);
if(result.likeUser.includes(req.user.id)){
db.collection("post").updateOne({_id:id},{$inc:{like:-1}},function(error,result){
if(error) return console.log(error);
db.collection("post").updateOne({_id:id},{$pull:{likeUser:req.user.id}},function(error,result){
if(error) return console.log(error);
})
})
} else {
db.collection("post").updateOne({_id:id},{$inc:{like:1}}, function(error,result){
if(error) return console.log(error);
db.collection("post").updateOne({_id:id},{$push:{likeUser:req.user.id}},function(error,result){
if(error) return console.log(error);
})
})
}
})
})2번 useEffect 무한 루프의 경우는 posts state 변경이 없어도 계속 useEffect 가 실행이 됩니다 ㅠㅠ
2021년 7월 8일 10:23 #11346
codingapple키 마스터1번은 코드는 res.send() 이런 부분이 빠져보이는 것 같긴 한데
별 문제 없어보이는데요 console.log 이런거 해놓고 어느쪽에서 어떤상황에서 멈추는지 정확히 판단해야 디버깅이 가능합니다
useEffect(()=>{
},[posts])
이렇게 써놓으면 posts라는 state가 변경될 때마다 useEffect가 실행되는 것이니
다른 곳 어딘가에서 posts를 변경하고있는게 아닐지 추적해봅시다
-
글쓴이글
- 답변은 로그인 후 가능합니다.