当前位置: 首页 > 知识库问答 >
问题:

使用React挂钩时从ESLint发出警告消息

宣冥夜
2023-03-14

我目前正在更新我的应用程序,使之适应React 16.8,这样我就可以使用令人敬畏的新钩子功能。更新React包(以及所有依赖项)不是问题,一切正常。但当我尝试设置ESLint时,当我尝试使用钩子时,它总是给我以下错误:

React钩子“useffect”在函数“projectInfo”中调用,该函数既不是React函数组件,也不是自定义React钩子函数

我的组件看起来像这样:

import React, { useState} from 'react';

const myComponent = () => {
  const [counter, setCounter] = useState(0);

  return <span onClick={() => setCounter(counter + 1)}>{counter}</span>;
};

export default myComponent;

我的. eslintsrc文件如下:

{
    "extends": ["react-app"],
    "plugins": [
        "react-hooks"
      ],
    "rules": {
        "no-console": ["warn", { "allow": ["info", "error"] }],
        "quotes": ["warn", "single"],
        "semi": ["warn", "always"],
        "no-debugger": ["warn"],
        "eqeqeq": ["warn"],
        "no-else-return": ["warn"],
        "no-extra-bind": ["warn"],
        "jsx-a11y/href-no-hash": false,
        "prefer-destructuring": [
            "warn",
            {
                "array": true,
                "object": true
            },
            {
                "enforceForRenamedProperties": false
            }
        ],
        "react-hooks/rules-of-hooks": "warn"
    }
}

编辑:在错误中表示projectInfo中有错误。为了简单起见,我用上面的myComponent代码对其进行了更改。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))
  };
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(projectInfo);

共有1个答案

谷玉韵
2023-03-14

这里的问题是组件名称以小写字母开头。

请参阅eslint插件代码源代码

/**
 * Checks if the node is a React component name. React component names must
 * always start with a non-lowercase letter. So `MyComponent` or `_MyComponent`
 * are valid component names for instance.
 */

function isComponentName(node) {
  if (node.type === 'Identifier') {
    return !/^[a-z]/.test(node.name);
  } else {
    return false;
  }
}
 类似资料:
  • 我已经创建了一个高阶组件,它应该为我的组件添加一些额外的功能。然而,当我在这个组件中使用反应钩子时,我会得到以下eslint警告。 不能在回调内调用React钩子“React.useffect”。必须在React函数组件或自定义React钩子函数中调用React钩子。(吊钩/吊钩规则) 为什么我会收到这个警告?在HoC中使用钩子被认为是不好的做法吗? 最简单的例子: Codesandbox:htt

  • 使用React 16.8.6(在以前的版本16.8.3上很好)时,当我试图防止fetch请求上的无限循环时,会出现这个错误 我一直找不到一个解决方案来停止无限循环。我希望不要使用。我确实找到了这个讨论https://github.com/facebook/react/issues/14920,其中一个可能的解决方案是我对自己在做什么不太有信心,所以我还没有尝试实现它。 我有这个当前的设置React

  • 问题内容: 当我从Eclipse(3.4)启动Tomcat(6.0.18)时,我收到此消息(日志中的第一条消息): 警告:[SetPropertiesRule] {服务器/服务/引擎/主机/上下文}将属性“源”设置为“ org.eclipse.jst.jee.server :(项目名称)”找不到匹配的属性。 似乎此消息没有严重影响,但是,有人知道如何消除它吗? 问题答案: 解决这个问题的方法非常简

  • 问题内容: 我有一个表单,用户需要输入日期和时间(2个不同的字段),并且时间不能超过12小时。因此,当时间超过12小时时,我想添加一条警告消息(很可能是弹出警报)。我正在使用JSF和Java。请帮帮我! 问题答案:

  • 太长,读不下去了如何模拟或使用带有数组的道具强制重置我的组件? 我正在实现一个组件,它显示一个计时器,并在达到零时执行回调。目的是让回调更新对象列表。后一个组件由新的React钩子和组成。 包含对计时器启动时间和剩余时间的引用。设置每秒钟调用一次的间隔,以更新剩余的时间,并检查是否应该调用回调。 该组件并不意味着重新安排计时器,或者在间隔达到零时保持间隔,它应该执行回调并空闲。为了让计时器刷新,我

  • 我有扩展其他抽象类JPA实体。我想使用@data来避免编写setter和getter,但我的equals和hashcode方法存在。 我得到警告,但我认为我不应该: 当我将@equalsandHashCode(callSuper=false)添加到@data中时,我得到: