Не удалось прочитать данные из полученного ресурса в React. (Невозможно прочитать свойство backdrop_path из undefined)

Я получил некоторые данные из конечной точки и сохранил их в состоянии. Когда я пытаюсь просмотреть результат в консоли, он работает нормально. Но когда я пытаюсь использовать его в компоненте, он выдает ошибку, сообщающую, что ключ не определен. Вот мой код, а heroImage не определен. Помогите, пожалуйста

const Home = () => {
  const [state, setState] = useState({ movies: [] });
  const [isLoading, setIsLoading] = useState(false);
  const [isError, setIsError] = useState(false);
  const fetchMovies = async endpoint => {
    setIsError(false);
    setIsLoading(false);

    const params = new URLSearchParams(endpoint);
    if (!params.get("page")) {
      setState(prev => ({
        ...prev,
        movies: [],
        searchItem: params.get("query")
      }));
    }

    try {
      const result = await fetch(endpoint)).json();

      setState(prev => ({
        ...prev,
        movies: [...prev.movies, result.results],
        heroImage: prev.heroImage || result.results[0],
        currentPage: result.page,
        totalPage: result.total_pages
      }));
    } catch (error) {
      setIsError(true);
    }
    setIsLoading(false);
  };

  useEffect(() => {
    fetchMovies(`${API_URL}movie/popular?api_key=${API_KEY}&page=1`);
  }, []);

  return (
    <>
      <div className="rmdb-home">
        <div>
          <HeroImage
            image={`${IMAGE_BASE_URL}${BACKDROP_SIZE}${state.heroImage.backdrop_path}`}
          />
          <SearchBar />
        </div>
      </div>
    </>
  );
};

person Nahid Islam    schedule 05.11.2019    source источник
comment
Не могли бы вы разместить это в Интернете, чтобы мы могли легко отладить его? Может, Codesandbox? Также не используйте state и setState для переменных useState. Может быть, попробуйте более конкретные, например [фильмы, setMovies]   -  person loQ    schedule 05.11.2019


Ответы (1)


потому что ваш компонент пытается получить доступ к heroImage при первом рендеринге, но он не определен

Итак, вам нужно начальное состояние для heroImage, например

const [state,setState]=useState({movies:[], heroImage: {}})
person Wilson Liao    schedule 06.11.2019
comment
Я думаю, что это также хорошая идея добавить здесь объяснение, почему это начальное состояние необходимо. - person Clarity; 06.11.2019
comment
@Nahid Islam, конечно, состояние инициализации не является обязательным, но state.heroImage.backdrop_path в доступе к функции рендеринга undefined.backdrop_path при первом рендеринге это вызовет исключение - person Wilson Liao; 06.11.2019