Распространенные ошибки React | Кодементор

Мы все были в такой ситуации, когда мы написали какой-то код, а ошибка — это следующая «логичная» вещь. Это может быть неприятно, когда мы сталкиваемся с этими сценариями, и может быть еще более болезненным, если у нас нет правильной настройки React для отладки.

Для устранения этих проблем необходимо понять проблему, отследить проблемную линию и исправить ее. Иногда это не так просто, так как ошибка может указывать на строку в одном файле, в то время как фактическая ошибка была в каком-то другом файле. В другой раз эти ошибки являются загадочными, что еще больше затрудняет их отслеживание.

Я хочу указать на некоторые распространенные ошибки, которые мы допускаем при работе с React, и на то, как их исправить. Это не исчерпывающий список ошибок, но я открыт для обновления списка.

С этим из пути, давайте найдем эти ошибки. 😃

  1. Вы сделали компонент без состояния / функциональный и не вернулись.
import React from "react";

const Error = () => {
  <div>Error</div>;
};

export default Error;

Вы получаете следующую ошибку:

Сообщение об ошибке довольно интуитивно понятно, на изображении выше вы можете видеть, что ошибка началась со строки 19, которая на самом деле не является причиной ошибки, а точкой, в которой ошибка была обнаружена. Исправить это так же просто, как добавить return в указанный функциональный компонент.

const Error = () => {
  return <div>Error</div>;
};

// OR

const Error = () => <div>Error</div>;
  1. Вызов метода обработчика событий, когда требуется ссылка на метод.
export default class Error extends React.Component {
  state = {
    text: ""
  };

handleChange = ({ target: { value } }) => {
    this.setState({ text: value });
  };

render() {
    return (
      <>
        <input
          onChange={this.handleChange()} {/* Error: method invocation */}
        />
      </>
    );
  }
}

Вы получаете сообщение об ошибке:

Это можно исправить двумя способами:

  • Передача ссылки вместо вызова метода следующим образом: onChange={this.handleChange}
  • Используйте функцию толстой стрелки: onChange={event => this.handleChange(event)}
  1. Импорт компонента, который не был экспортирован, и его использование в render() . Это также может произойти в результате смешивания импорта по умолчанию и именованного импорта.

Исправить это так же просто, как экспортировать компонент, а в случае перепутанного импорта убедитесь, что вы импортируете компонент правильно.

  1. У вас есть компонент, подключенный к редуксу, и вы вызываете действие/функцию из реквизитов компонента, которые вы еще не передали. mapDispatchToProps() .

  2. В React 16.8.0 были добавлены хуки. Когда вы вызываете установщик хука непосредственно в обработчике событий, как показано ниже:

const Hooks = props => {
  const [value, setValue] = useState("Awesome");

return (
    <div>
      Hooks are here and they are great!! No I meant{" "}
      <strong>
        <em>{value}</em>!
      </strong>
      <br />
      <hr />
      <button onClick={setValue("Fantastic")}>Change Text</button>
    </div>
  );
};

Возникает следующая ошибка:

Это можно исправить, изменив onClick={setValue(“Fantastic”)} к onClick={() => setValue(“Fantastic”)} .

  1. Иногда ошибка может быть сложной. Возьмем, к примеру, ошибку ниже:

Существуют различные причины такого рода ошибок, некоторые из которых уже перечислены выше. Помимо уже упомянутых причин, это может быть результатом обновления версии React, скажем, перехода с v15 на v16, а не обновления устаревших методов жизненного цикла.

  1. Еще ошибка такая:
Warning: Functions are not valid as a React child.
This may happen if you return a Component instead of <Component /> from render.
Or maybe you meant to call this function rather than return it.

Сценарий этой ошибки таков:

<select name="category">
    value={category} 
    onChange={this.handleChange}/>
    <option>Select a category</option>
    ...
</select>

Из кода вы быстро заметите, что select элемент был закрыт сразу после name атрибут, оставляющий другие атрибуты (value а также onChange) висит плюс есть еще один самозакрывающийся тег после onChange атрибут. Их удаление устраняет ошибку.

  1. Другая ошибка может быть следующей:
    1_IGt-SjSkojgG48q27SwGlg.png

Этот код породил эту ошибку:

return(
   <ul onClick="this.handleToggle()">
     ...
   </ul>
);

Причина ошибки довольно проста, onClick ожидает функцию, но вместо этого получает строковый тип. Быстрое решение этой проблемы — удалить окружающие кавычки и заменить их на {} как это: <ul onClick={this.handleToggle()}>

  1. Взгляните на следующий код:
function App() {
  function handleRefresh() {
    window.location.reload();
  }
return (
    <div>
      <h1>Headlines</h1>
      <button onClick={handleRefresh()}>Reload</button>
    </div>
  );
}

На первый взгляд вы можете подумать, что в приведенном выше коде нет ничего плохого, но запустив его, вы окажетесь в состоянии бесконечного повторного рендеринга. Почему?
Ну, ваш обработчик событий кнопки вызывает handleRefresh() метод, который напрямую вызывает window.location.reload() . Если вам действительно необходимо это сделать, то небольшая модификация вашего onClick обработчик делает свое дело. onClick={() => handleRefresh()} исправляет это.

Вывод

Ошибки сейчас являются частью нашей разработки, и мы видим их даже в работающем коде. То, что мы делаем, когда их находят, имеет значение. У меня такое ощущение, что вы в какой-то момент видели эти ошибки или все еще имеют их в данный момент времени. Я надеюсь, что это поможет вам исправить их.

Не стесняйтесь предлагать дополнение к этому.

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *