You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js中无法实现广告点赞递增功能的技术求助

问题分析与修复方案

你的代码核心问题在于用了一个全局的currLike状态管理所有广告的点赞数,不符合每条广告独立计数的需求,且点赞逻辑、状态更新均存在错误,具体修复如下:

1. 移除无用全局状态

删掉const [currLike, setLike] = useState(0);,每条广告的点赞数已存在adsList的对应元素中,无需单独全局状态。

2. 修正点赞请求逻辑

addLike函数需要基于当前广告的现有点赞数加1后传给后端,同时去掉错误的setLike调用,改用重新拉取广告数据更新页面:

const addLike = async (id, currentLikes) => {
  await axios.put('http://localhost:3001/update', {
    id: id,
    likes: currentLikes + 1
  });
  getAds();
};

3. 调整按钮点击传参

渲染广告时,给点赞按钮传入当前广告的likes值:

<button 
  type="button" 
  onClick={() => addLike(val.id, val.likes)} 
  className="btn btn-success"
>
  LIKE
</button>

4. 优化页面更新方式

删除window.location.reload(),改用getAds()更新adsList状态实现局部刷新,提升体验。

完整修改后代码

function Ads() {
  const [selectedDate, setSelectedDate] = useState(null);
  const [adsList, showAdsList] = useState([]);

  const getAds = async () => {
    const response = await axios.get('http://localhost:3001/showAds');
    showAdsList(response.data);
  };

  const addLike = async (id, currentLikes) => {
    await axios.put('http://localhost:3001/update', {
      id: id,
      likes: currentLikes + 1
    });
    getAds();
  };

  useEffect(() => {
    getAds();
  }, []);

  return (
    <div>
      <div className="showAds" >
        {adsList.map((val, key) => {
          return (
            <div className="ad" key={key}>
              <h4>{val.content}</h4>
              <h5><a href="">{val.adress}</a></h5>
              <h5>Likes: {val.likes}</h5>
              <div>
                <button 
                  type="button" 
                  onClick={() => addLike(val.id, val.likes)} 
                  className="btn btn-success"
                >
                  LIKE
                </button>
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
}

export default Ads;

可选优化

如果要防止用户重复点击同一广告点赞,可新增状态记录已点赞的广告ID:

  • 新增状态:const [likedAds, setLikedAds] = useState([]);
  • 在addLike中先判断likedAds是否包含当前广告ID,若包含则不发起请求,否则请求后将ID加入likedAds
  • 按钮添加禁用状态:disabled={likedAds.includes(val.id)}

内容的提问来源于stack exchange,提问作者user19460705

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:25:29