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

React多评分组件更新异常求助:仅首个组件值可更新

问题根源与解决方案

1. 模态框ID全局重复(核心问题)

所有StarCard组件渲染的模态框都使用同一个id="exampleModal",而Bootstrap模态框是通过ID匹配触发的。这导致无论点击哪个电影卡片的评分按钮,只会唤起第一个模态框,自然只有第一个组件的状态会被修改。

修改方式:
给每个模态框生成唯一ID,用电影ID拼接:

// StarCard组件中,按钮的data-target修改为
<button
    type="button"
    data-toggle="modal"
    data-target={`#exampleModal-${movie.id}`}
    style={{ background: "inherit", border: "none" }}
    onClick={() => {
        setRating(ratedValue);
    }}>
    {/* 按钮内容 */}
</button>

// 对应的模态框id修改为
<div className="modal fade" id={`exampleModal-${movie.id}`} tabIndex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    {/* 模态框内容 */}
</div>

2. useEffect依赖缺失,无法响应数据更新

StarCard中的useEffect依赖数组为空,只会在组件首次挂载时执行一次。当从详情页评分返回列表页,或者用户/电影数据变化时,组件不会重新拉取最新的评分信息。

修改方式:
将movie.id和user加入依赖数组,确保相关数据变化时重新执行异步逻辑:

useEffect(() => {
    (async () => {
        try {
            const ratedValue = await GetRating({ user_id: user._id, movie_id: movie.id });
            setRatedValue(ratedValue);
        } catch (err) {}

        const listsData = await fetchLists(user._id);
        setLists(listsData);
    })();
}, [movie.id, user]);

3. 父组件状态同步优化(若已迁移状态到父组件)

如果已经将评分状态移到父组件,需确保子组件直接使用父组件传入的props,而非自身维护状态:

  • 父组件维护一个ratings对象,键为电影ID,值为对应评分
  • StarCard不再用useState维护ratedValue,直接接收props.ratedValue
  • 评分修改后,父组件更新ratings对象,所有子组件自动同步最新数据

内容的提问来源于stack exchange,提问作者İdris Uslu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:23:16