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

React(Next.js)自定义hook内点击事件无法修改父组件状态如何解决?

问题核心原因

你当前父组件和子组件分别定义了完全独立的industrySelected状态,两者互不关联。子组件点击事件修改的是自身内部的状态,父组件的状态完全没有收到更新通知,所以下方的筛选列表不会触发重新渲染。

解决步骤

1. 修改父组件(Industries页面)

给Table组件传递父组件的状态更新方法setIndustrySelected,将父组件渲染Table的代码调整为:

<Table data={array} onIndustrySelect={setIndustrySelected} />

2. 修改子组件(useTable.js)

删除子组件内部自己定义的industrySelected相关useState代码,点击时直接调用父组件传过来的更新方法即可,调整后的子组件核心代码如下:

const Table = (props) => {
    const { items, requestSort, sortConfig } = useSortableData(props.data);
    // 删掉原有子组件内部的状态定义行
    // const [industrySelected, setIndustrySelected] = useState("");

    const getClassNamesFor = (name) => {
        if (!sortConfig) return;
        return sortConfig.key === name ? sortConfig.direction : undefined;
    };
    return (
        <div>
            <table>
                <thead>
                    ...
                </thead>
                <tbody>
                    {items.map((item) => (
                        <tr key={item[0]}>
                            <td>
                                <a
                                    href="#list"
                                    onClick={() => {
                                        // 调用父组件传入的更新方法同步状态
                                        props.onIndustrySelect(item[0]);
                                    }}
                                >
                                    {item[0]}
                                </a>
                            </td>
                            <td>{item[1]}</td>
                        </tr>
                    ))}
                </tbody>
            </table>
        </div>
    );
};

可选优化

如果需要在子组件中使用选中的行业值做高亮等样式处理,可以同时把父组件的industrySelected状态也传递给子组件:

// 父组件传值
<Table 
  data={array} 
  industrySelected={industrySelected} 
  onIndustrySelect={setIndustrySelected} 
/>

子组件直接通过props.industrySelected读取值即可,不需要再单独维护内部状态。

单文件合并逻辑注意点

如果把两边逻辑合并到同一个文件,直接删除重复的状态定义,共用父组件声明的industrySelected和setIndustrySelected即可,不要重复定义相同用途的状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:04