debugging 如何确保计数器在递增/递减时的状态对于每个用户ID都是唯一的?

qgelzfjb  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一个练习网络应用程序,我正在努力模仿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);
    }

}
w8f9ii69

w8f9ii691#

你似乎把喜欢和照片联系起来了。UserId所以在这个答案的其余部分我会假设这是可行的,因为每个用户只有一张照片,而UserId实际上是一个照片id(假设是一张个人资料图片)。
你描述的最初问题来自于你的handleLikesBasedOnUserId函数。如果currentUserClicks是1,那么它将被设置为0,如果它是0,那么它将被设置为1。这就是为什么你在每次点击时保持喜欢/不喜欢。
为了避免这种情况,需要进行一些结构重构。我将主要关注前端部分。
让我们看一下数据结构:变量currentUserClicks是否相关?实际上不相关。您并不关心用户总共点击了多少次。您需要了解的是,对于每张照片,用户是否喜欢该照片?
同样,isLikedClickedisDislikedClickeduserLikes(据我所知,这是一张特定照片的喜欢次数?)只适用于1张照片,而你在网格上有多张照片。
知道了这一点,您应该考虑删除这些状态,并考虑userLikedPhotos,它应该是一个字典{[photoId:字符串]:boolean}或者只是一组喜欢的照片id。对于你当前的用户,这将是他喜欢的照片。它将提供你需要的所有信息,onClick on a photo,如果photoId在userLikedPhotos中,则意味着您正在执行一个不相似的操作。如果它不在userLikedPhotos中,(或者如果userLikes[photoId] === false),则您将执行类似操作。
因此,您的代码可能如下所示:
第一个
关于后端,我认为你不应该存储喜欢的数量,而是喜欢某张照片的用户列表,这个列表的长度应该是喜欢的数量。这样如果用户刷新页面,你就可以检索到他已经喜欢的照片。

相关问题