我有一个练习网络应用程序,我正在努力模仿Instagram的类似系统。
在我下面的代码中,递增/递减是有效的,它是以全局方式递增/递减的。
换句话说,如果我点击用户A的照片来增加其喜欢的数量,这是正常的。
之后,如果我点击用户B的照片,它不会增加,而是减少。
然后,如果我单击用户C的照片,它会递增
等等....
似乎所有用户都共享了赞状态,这是不正确的
我希望喜欢/不喜欢的系统能跟Instagram的一样,但似乎不能完全确定下来。下面是实现这一切的所有代码。不知道我做错了什么。Gallery.js
:
const [isLikedClicked, setIsLikeClicked] = useState(false);
const [isDislikeClicked, setIsDislikeClicked] = useState(false);
const [userLikes, setUserLikes] = useState(null);
const [currentUserClicks, setCurrentUserClicks] = useState(null);
const handleLikesBasedOnUserId = (likedPhotoUserId) => {
if(currentUserClicks >= 1) {
setCurrentUserClicks(currentUserClicks - 1);
setIsDislikeClicked(true);
handleDislike(likedPhotoUserId);
} else {
setCurrentUserClicks(currentUserClicks + 1);
setIsLikeClicked(true);
handleLike(likedPhotoUserId);
}
};
const handleLike = (likedPhotoUserId) => {
const url = 'http://127.0.0.1:8000/api/like';
const headers = {
"Accept": 'application/json',
"Authorization": `Bearer ${authToken}`
};
let data = {
'UserID': likedPhotoUserId
};
axios.post(url, data, {headers})
.then(resp => {
setUserLikes(resp.data.userLikes);
}).catch(err => {
console.log(err);
});
};
const handleDislike = (likedPhotoUserId) => {
const url = 'http://127.0.0.1:8000/api/dislike';
const headers = {
"Accept": 'application/json',
"Authorization": `Bearer ${authToken}`
};
let data = {
'UserID': likedPhotoUserId
};
axios.post(url, data, {headers})
.then(resp => {
setUserLikes(resp.data.userLikes);
}).catch(err => {
console.log(err);
});
};
return (
<>
<div className="main">
<ul className="cards">
{
gridData.map((photos) => {
return <Grid
likes={photos.likes}
src={photos.url}
currentUserClicks={currentUserClicks}
onClick={handleLikesBasedOnUserId}
isLikedClicked={isLikedClicked}
userId={photos.UserID}
/>
})
}
</ul>
</div>
</>
);
Grid.js
:
const [likes, setLikes] = useState(props.likes);
const [likeValue, setLikeValue] = useState(null);
return (
<>
<li className="cards_item">
<div>
<div className="card_image">
<img src={props.src} alt="Photo" className="gallery-img" onClick={() => props.onClick(props.userId, props.isLikedClicked ? setLikeValue(props.user) : setLikes(props.likes + 1))}/>
</div>
<span style={{display: 'none'}}>{props.currentUserClicks}</span>
<h5 className="likes">Likes: {likes}</h5>
</div>
</li>
</>
);
后端控制器操作:
public function handleLike(Request $request)
{
try {
$userId = $request->get('UserID');
Uploads::where(['UserID' => $userId])->update(['likes' => DB::raw('likes + 1')]);
$getUserLikes = $this->__usersRepository->getUserLikes($userId);
$userLikes = $getUserLikes[0]->likes;
return [
'UserID' => $userId,
'userLikes' => $userLikes,
];
} catch (\Exception $e) {
Log::error($e->getMessage());
throw new \Exception($e->getMessage(), $e->getCode(), $e);
}
}
public function handleDislike(Request $request)
{
try {
$userId = $request->get('UserID');
Uploads::where(['UserID' => $userId])->update(['likes' => DB::raw('likes - 1')]);
$getUserLikes = $this->__usersRepository->getUserLikes($userId);
$userLikes = $getUserLikes[0]->likes;
return [
'UserID' => $userId,
'userLikes' => $userLikes
];
} catch (\Exception $e) {
Log::error($e->getMessage());
throw new \Exception($e->getMessage(), $e->getCode(), $e);
}
}
1条答案
按热度按时间w8f9ii691#
你似乎把喜欢和照片联系起来了。UserId所以在这个答案的其余部分我会假设这是可行的,因为每个用户只有一张照片,而UserId实际上是一个照片id(假设是一张个人资料图片)。
你描述的最初问题来自于你的
handleLikesBasedOnUserId
函数。如果currentUserClicks
是1,那么它将被设置为0,如果它是0,那么它将被设置为1。这就是为什么你在每次点击时保持喜欢/不喜欢。为了避免这种情况,需要进行一些结构重构。我将主要关注前端部分。
让我们看一下数据结构:变量
currentUserClicks
是否相关?实际上不相关。您并不关心用户总共点击了多少次。您需要了解的是,对于每张照片,用户是否喜欢该照片?同样,
isLikedClicked
、isDislikedClicked
和userLikes
(据我所知,这是一张特定照片的喜欢次数?)只适用于1张照片,而你在网格上有多张照片。知道了这一点,您应该考虑删除这些状态,并考虑
userLikedPhotos
,它应该是一个字典{[photoId:字符串]:boolean}或者只是一组喜欢的照片id。对于你当前的用户,这将是他喜欢的照片。它将提供你需要的所有信息,onClick on a photo,如果photoId在userLikedPhotos
中,则意味着您正在执行一个不相似的操作。如果它不在userLikedPhotos
中,(或者如果userLikes[photoId] === false),则您将执行类似操作。因此,您的代码可能如下所示:
第一个
关于后端,我认为你不应该存储喜欢的数量,而是喜欢某张照片的用户列表,这个列表的长度应该是喜欢的数量。这样如果用户刷新页面,你就可以检索到他已经喜欢的照片。