Задержка загрузки массива приводит к зависанию приложения

Йо-йо всем,

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

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

  1. Данные извлекаются из списка пользователей «jsonplaceholder».
  2. Данные устанавливаются как состояние.
  3. Отправлено на "UserProfilePage".
  4. Отправлено в "UserProfileComponent".

Попытка получить доступ к URL "/user/1" не увенчается успехом, поскольку объект не определен.

*) Если вы прокомментируете «UserProfileComponent», а затем раскомментируете его без обновления, страница будет успешно загружена.
*) Копирование (не выборка) данных в App.js, присвоение их состоянию не приведет к краху системы.

APP.js

import { Component } from "react";
import { Redirect, Route, Switch } from "react-router-dom";
import "./App.css";

import Navigation from "./components/header/Navigation";
import PostsLog from "./components/Posts/PostsLog";

import UserProfileCollection from "./pages/UserProfileCollection";
import UserProfilePage from "./pages/UserProfilePage";

const POST_ENDPOINT = "https://jsonplaceholder.typicode.com/posts";
const USER_ENDPOINT = "https://jsonplaceholder.typicode.com/users";

class App extends Component {
  constructor() {
    super();
    this.state = {
      exUsersArray: [],
      exPostsArray: [],
    };
  }

  async componentDidMount() {
    try {
      const responseUser = await fetch(USER_ENDPOINT);
      const responsePost = await fetch(POST_ENDPOINT);
      const dataResponseUser = await responseUser.json();
      const dataResponsePost = await responsePost.json();
      this.setState({ exUsersArray: dataResponseUser });
      this.setState({ exPostsArray: dataResponsePost });
    } catch (error) {
      console.info(error);
    }
  }
  render() {
    const { exUsersArray, exPostsArray } = this.state;
    console.info(exUsersArray);
    return (
      <div className = "app">
        <Navigation />
        <main>
          <Switch>
            {/* REROUTES */}
            <Route path = "/" exact>
              <Redirect to = "/feed" />
            </Route>
            <Route path = "/users" exact>
              <Redirect to = "/user" />
            </Route>

            {/* REAL ROUTES */}
            <Route path = "/feed">
              <PostsLog usersInfo = {exUsersArray} usersPosts = {exPostsArray} />
            </Route>
            <Route path = "/user" exact>
              <UserProfileCollection usersInfo = {exUsersArray} />
            </Route>

            {/* DYNAMIC ROUTES */}
            <Route path = "/user/:userId">
              <UserProfilePage usersInfo = {exUsersArray} />
            </Route>
          </Switch>
        </main>
      </div>
    );
  }
}

export default App;

UserProfilePage.js

import { useParams } from "react-router-dom"
import UserProfileComponent from "../components/UserProfileComponent";

const UserProfilePage = ({usersInfo}) => {
    const params = useParams();
    const foundUser = usersInfo.find((user) => Number(user.id) === Number(params.userId))
    console.info("found user  ", foundUser);
    // console.info(usersInfo);
    console.info(params, " is params");
    
    return(
        <div>
            <UserProfileComponent userProfile = {foundUser}/>
            <p>Yo YO</p>
        </div>
    )
}

export default UserProfilePage;

UserProfileComponent

const UserProfileComponent = ({userProfile}) => {
console.info(userProfile)

  return (
    <div className = "text-group">
        <div className = "wrap-post">
        <p>
          <strong>Info</strong>
        </p>
        <img
          src = {`https://robohash.org/${userProfile.Id}.png`}
          id = "small-profile"
          alt = "user profile in circle"
        />
        <p><u><strong>ID</strong></u> : {userProfile.id}</p>
        <p>Name: {userProfile.name}</p>
        <p>@{userProfile.username}</p>
        <p>Email: {userProfile.email}</p>
        <p>
          {userProfile.address.street} {userProfile.address.suite}<br/>
          {userProfile.address.zipcode} {userProfile.address.city}
        </p>
        <p>Global position</p>
        <p>{userProfile.address.geo.lat}, {userProfile.address.geo.lang}</p>
        <p>{userProfile.phone}</p>
        <p>{userProfile.website}</p>
        <p>Company</p>
        <p>{userProfile.company.name}</p>
        <p>{userProfile.company.catchPhrase}</p>
        <p>{userProfile.company.bs}</p>
      </div>
    </div>
  );
};

export default UserProfileComponent;

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

С наилучшими пожеланиями.

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

Ответы 2

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

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

UserProfilePage.js


import { useParams } from "react-router-dom"
import UserProfileComponent from "../components/UserProfileComponent";

const UserProfilePage = ({usersInfo}) => {
    const params = useParams();
    if (!usersInfo) {
        return <p>Loading...</p>
    }
    const foundUser = usersInfo.find((user) => Number(user.id) === Number(params.userId))
    console.info("found user  ", foundUser);
    // console.info(usersInfo);
    console.info(params, " is params");
    
    return(
        <div>
            <UserProfileComponent userProfile = {foundUser}/>
            <p>Yo YO</p>
        </div>
    )
}

export default UserProfilePage;


UserProfileComponent.js

const UserProfileComponent = ({userProfile}) => {
  if (!userProfile) {
    return <p>Loading...</p>
  }


  console.info(userProfile)

  return (
    <div className = "text-group">
        <div className = "wrap-post">
        <p>

Понятно. Большое спасибо Асад.

Zuriel S. G. 20.03.2022 22:16

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

<p><u><strong>ID</strong></u> : {userProfile.id}</p>
        <p>Name: {userProfile.name}</p>
        <p>@{userProfile.username}</p>
        <p>Email: {userProfile.email}</p>
        <p>
          {userProfile.address.street} {userProfile.address.suite}<br/>
          {userProfile.address.zipcode} {userProfile.address.city}
        </p>
        <p>Global position</p>
        <p>{userProfile.address.geo.lat}, {userProfile.address.geo.lang}</p>
        <p>{userProfile.phone}</p>
        <p>{userProfile.website}</p>
        <p>Company</p>
        <p>{userProfile.company.name}</p>
        <p>{userProfile.company.catchPhrase}</p>
        <p>{userProfile.company.bs}</p>

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

Кроме того, я предлагаю вам создать loading в своем штате.

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

  2. И когда ваша загрузка верна, вы можете показать какой-нибудь счетчик или что-то в этом роде. Когда ваш запрос завершится, вы можете установить для переменной загрузки значение false и показать свои данные.

Главное, всегда используйте переменную loading для проверки состояния загрузки вместо проверки состояния null | undefined ваших данных.

Отличный ответ! Мне нравится твоя разработка. Спасибо!

Zuriel S. G. 20.03.2022 22:18

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