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

React 16.8升级后使用Hooks遭遇ESLint报错问题咨询

解决React Hook ESLint报错:“React Hook在非函数组件/自定义Hook中调用”

嗨,这个问题我太熟了!你的ESLint报错根本原因很简单——你的组件名是小写开头的projectInfo。

ESLint的react-hooks/rules-of-hooks规则是跟着React的官方命名约定走的:React函数组件必须以大写字母开头,只有这样ESLint才能识别出这是一个React组件,而不是普通的JS函数。你现在把组件命名成小写,ESLint自然会把它当成普通函数,然后报错说你在非组件/非Hook函数里调用了Hook。

解决方案:把组件名改成大写开头

只需要修改组件的命名,同时同步更新导出时的引用即可:

// 把组件名从projectInfo改成ProjectInfo
const ProjectInfo = props => {
  const [createdLink, setCreatedLink] = useState(null);
  const [getProjectStatus, asyncGetProject] = useAsyncCall(props.getProject);
  const [generateLinkStatus, asyncGenerateLink] = useAsyncCall(api.questionnaire.generateQuestionnaireToken);

  // ComponentWillMount
  useEffect(() => {
    if (!props.project) {
      asyncGetProject(props.match.params.id);
    }
  }, []);

  const generateQuestionnaireLink = async () => {
    const response = await asyncGenerateLink(props.project.questionnaireId);
    const createdLink = `${window.location.host}/questionnaire/${response.data.id}`;
    setCreatedLink(createdLink);
  };

  const { translate, project, updateProject } = props;
  const errorMessage = generateLinkStatus.error.message || getProjectStatus.error.message;

  return (
    <div className={styles.profileContainer}>
      <Message message={errorMessage} status={'error'} />
      <BackButton />
      <Loading isVisible={getProjectStatus.loading} />
      {project && (
        <Fragment>
          <EditableForm entity={project} onSubmit={updateProject}>
            <Label text={translate('projectName')} name={'name'} />
            <Checkbox text={translate('isPublic')} name={'isPublic'} />
          </EditableForm>
          <Loading isVisible={generateLinkStatus.loading} />
          <Button text={translate('generateButton')} clickHandler={generateQuestionnaireLink} />
          <br />
          {createdLink && <span>{createdLink}</span>}
        </Fragment>
      )}
    </div>
  );
};

const mapStateToProps = state => {
  return {
    translate: getTranslate(state.locale),
    project: state.project.currentProject
  };
};

const mapDispatchToProps = dispatch => {
  return {
    getProject: id => dispatch(actions.getProject(id)),
    updateProject: (id, params) => dispatch(actions.updateProject(id, params))
  };
};

// 这里的组件名也要同步改成ProjectInfo
export default connect(
  mapStateToProps,
  mapDispatchToProps
)(ProjectInfo);

额外提醒

你提供的myComponent示例其实也存在同样的命名问题,虽然它没触发报错(因为没用到useEffect这类Hook),但为了规范和避免后续问题,建议也改成MyComponent哦。

另外检查了你的.eslintrc配置,react-hooks插件和规则都已经正确启用了,所以不需要调整配置,只要改组件名就能解决问题啦!

内容的提问来源于stack exchange,提问作者Bob van 't Padje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:27:57