Предупреждение от ESLint при использовании React Hooks

В настоящее время я обновляю свое приложение до React 16.8, чтобы использовать потрясающую новую функцию хука. Обновление пакета React (и всех зависимостей) не было проблемой, и все работает нормально. Но когда я пытаюсь настроить ESLint, он продолжает выдавать следующую ошибку, когда я пытаюсь использовать хуки:

React Hook "useEffect" is called in function "projectInfo" which is neither a React function component or a custom React Hook function

Мой компонент выглядит так:

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. Информация о проекте выглядела так:

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);

что такое "информация о проекте"? Вы можете показать код "projectInfo"?

Mohamed Ramrami 09.02.2019 12:27

Я добавил компонент projectInfo в вопрос. См. раздел «Правка»

Bob van 't Padje 09.02.2019 12:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
2
1 740
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема здесь в том, что имя вашего компонента начинается со строчной буквы.

См. источник кода eslint-plugin-react-hooks

/**
 * 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;
  }
}

Другие вопросы по теме