Возможно, вы перепутали импорт по умолчанию и именованный импорт: только с использованием импорта по умолчанию

#reactjs #api #import

#reactjs #API #импорт

Вопрос:

Я работаю над приложением React с использованием API. Я пытаюсь отобразить изображения плакатов, однако я получаю эту ошибку: React.createElement: недопустимый тип — ожидаемая строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получил: undefined . Вероятно, вы забыли экспортировать свой компонент из файла, в котором он определен, или вы могли перепутать импорт по умолчанию и именованный импорт.

В ошибке указано, что проблема, вероятно, связана с моим импортом или экспортом, но я не понимаю, как это может вызвать проблему.

Index.jsx

 import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import '../assets/stylesheets/application.scss';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);
 

App.js

 import React, { useState } from 'react';
import MovieList from './components/MovieList';

import '../assets/stylesheets/application.scss';

const App = () => {
  const [movies, setMovies] = useState([{
            "Title": "Star Wars: Episode IV - A New Hope",
            "Year": "1977",
            "imdbID": "tt0076759",
            "Type": "movie",
            "Poster": "https://m.media-amazon.com/images/M/MV5BNzVlY2MwMjktM2E4OS00Y2Y3LWE3ZjctYzhkZGM3YzA1ZWM2XkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SX300.jpg"
        },
        {
            "Title": "Star Wars: Episode V - The Empire Strikes Back",
            "Year": "1980",
            "imdbID": "tt0080684",
            "Type": "movie",
            "Poster": "https://m.media-amazon.com/images/M/MV5BYmU1NDRjNDgtMzhiMi00NjZmLTg5NGItZDNiZjU5NTU4OTE0XkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SX300.jpg"
        },
        {
            "Title": "Star Wars: Episode VI - Return of the Jedi",
            "Year": "1983",
            "imdbID": "tt0086190",
            "Type": "movie",
            "Poster": "https://m.media-amazon.com/images/M/MV5BOWZlMjFiYzgtMTUzNC00Y2IzLTk1NTMtZmNhMTczNTk0ODk1XkEyXkFqcGdeQXVyNTAyODkwOQ@@._V1_SX300.jpg"
        }]);
  return (
    <div>
      <MovieList movies={movies} />
    </div>
  );
};

export default App;
 

MovieList.js

 import React from 'react';

const MovieList = (props) => {
  return (
    <React.Fragment>
      {props.movies.map((movie, index) => (
      <div>
        <img src={movie.Poster} alt='movie'></img>
      </div>
      ))}
    </React.Fragment>
  );
};

export default MovieList;
 

Я консоль.зарегистрировал мой список фильмов, и моя функция появляется в моем App.js так что, похоже, он импортирует правильно, так что что-то может быть не так с моим App.js но я не вижу никаких ошибок. Я использую только импорт и экспорт по умолчанию, нужно ли мне менять их на именованный вариант?

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

1. console.log(props.movies) в MovieList вернул что-нибудь?

2. Я зарегистрировал его в консоли, и теперь он говорит, что props не определен. Я попытался изменить его на this.props.movies, но получаю ту же ошибку.

3. вы проверяете свои фактические коды на наличие орфографических ошибок и т.д., Это функциональный компонент, поэтому здесь нет «этого». Приведенный выше код выглядит нормально для меня, props должен возвращать объект, содержащий фильмы. Возможно, вы захотите поделиться имеющимися у вас фактическими кодами.

4. После поиска кажется, что у многих людей возникает эта проблема, но основного решения нет. Я изменил свои компоненты с Component на { Component }, добавил расширения файлов из экспорта, проверил свой webpack.config, ничего. У меня есть ошибки типа «warning.js:33 Предупреждение: React.createElement: тип недопустим» и «Неперехваченное инвариантное нарушение: недопустимый тип элемента: ожидалась строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получено: не определено». Консольная регистрация моих реквизитов каким-то образом показывает, что она не определена.

5. удалите папку node_module и снова установите npm.

Ответ №1:

Для меня код выглядит нормально, просто исправьте две вещи в компоненте MovieList

  • при возврате карты добавьте уникальный ключ в div
  • заменить ></img> на />

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

1. Исправлена ли эта проблема?