Ошибка типа: объект (…) не является функцией после рефакторинга из класса в функциональный компонент

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я только что реорганизовал устаревшее приложение React 16.6.3 из SearchBar компонента на основе классов в функциональный компонент следующим образом:

 import React, { useState } from 'react';

const SearchBar = ({ onFormSubmit }) => {
  const [term, setTerm] = useState('');

  const onSubmit = (event) => {
    event.preventDefault();

    onFormSubmit(term);
  };

  return (
    <div className="search-bar ui segment">
      <form onSubmit={onSubmit} className="ui form">
        <div className="field">
          <label>Video Search</label>
          <input
            type="text"
            value={term}
            onChange={(event) => setTerm(event.target.value)}
          />
        </div>
      </form>
    </div>
  );
};

export default SearchBar;
 

Я не вижу ничего плохого в своем коде, он должен работать так, как ожидалось, даже если мне еще предстоит реорганизовать App компонент из класса в функциональный компонент. Я импортирую SearchBar подобное так:

 import React from "react";
import SearchBar from "./SearchBar";
import youtube from "../apis/youtube";
import VideoList from "./VideoList";
import VideoDetail from "./VideoDetail";

class App extends React.Component {
  state = { videos: [], selectedVideo: null };

  componentDidMount() {
    this.onTermSubmit("JavaScript");
  }
 

Что здесь дает, я не могу определить, где я допустил ошибку. Вот точная ошибка:

 TypeError: Object(...) is not a function
SearchBar
src/components/SearchBar.js:3
  1 | import React, { useState } from 'react';
  2 | 
> 3 | const SearchBar = ({ onFormSubmit }) => {
  4 |   const [term, setTerm] = useState('');
  5 | 
  6 |   const onSubmit = (event) => {
View compiled
▶ 22 stack frames were collapsed.
Module../src/index.js
src/index.js:5
  2 | import ReactDOM from 'react-dom';
  3 | import App from './components/App';
  4 | 
> 5 | ReactDOM.render(<App />, document.querySelector('#root'));
  6 | 
View compiled
 

Комментарии:

1. Также, пожалуйста, добавьте, как вы отображаете компонент панели поиска внутри компонента приложения. Только что видел вашу версию React, уверен, что хуков не было в React версии 16.6.3. Думаю, они были добавлены в версии 16.7 или, может быть, версии 16.8. Исправляет ли обновление вашей версии React ошибку?

2. @Jayce444, продолжай и опубликуй свое предложение в качестве ответа. Я обновил react и react-dom до 16.11.0 , и ошибка исчезла.

Ответ №1:

Согласно комментарию @Daniels, это было связано с тем, что React был версии 16.6.3, которая была до того, как были поддержаны перехваты. Обновление react и react-dom до версии 16.11.0 устранило проблему