@evg_96

Как обнаружить в чем ошибка загрузки данных с сервера (React/Redux/thunk)?

Прохожу курс по реакту, дошел до 7/9 урока. Все до этого было более менее нормально. Дошло время до добавления функционала загрузки комментариев для статьи. Повторил все за лектором, но в итоге на каком то этапе что то идет не по плану. В итоге в компонент не передается объект комментария, следовательно, не возможно получить автора и текст комментария из пустого объекта.

Логика такая: есть action, в middleware обрабатывается запрос на сервер (fetch), возвращается response.json(). В reducers (comment.js) обрабатывается "LOAD_ARTICLE_COMMENTS_SUCCESS" (используется immutable.js). Возвращается
commentsState.mergeIn(['entities'], arrToMap(action.response, CommentRecord));
. В CommentList вызывается AC loadArticleComments(). В Comment через selector запрашивается комментарий (commentSelector()). В селекторе по id возвращается коммент.

В итоге на каком то шаге что то где то идет не так как запланировано. Вроде бы все как у лектора написал, 100 раз перепроверил, но в итоге ошибка...

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

сервер в папке simple_api. Запрос комментариев по
url: http://localhost:3000/api/comment?article={articleId}


Для запуска проекта:
1. npm start
2. /simple_api node server.js

Google drive ссылка на проект
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Итак, у вас отсутствуют условия инициации загрузки комментариев в CommentsList:
componentWillReceiveProps({ isOpen, article, loadArticleComments }) {
      loadArticleComments(article.id)
  }

каждый раз когда компонент получает новые свойства он вызывает componentWillReceiveProps. С правильно настроенными параметрами в redux он это делать будет вечно. Исправить можно так:
componentWillReceiveProps({ isOpen, article, loadArticleComments }) {
      if (
           !article.commentsLoaded &&
           !article.commentsLoading &&
           !this.props.isOpen &&
           isOpen
         ) {
            loadArticleComments(article.id)
      }
  }

Расшифровывается так: если комментарии не загруженны и еще не загружаются и если список был закрыт и открылся, то можно загрузить комментарии. Как только они будут загруженны, проверка условий будет вылетать на первом шаге.

В редюсере не помню что было но надо так:
case "LOAD_ARTICLE_COMMENTS_SUCCESS": {
      return articleState
        .setIn(["entities", action.payload.articleId, "commentsLoading"], false)
        .setIn(["entities", action.payload.articleId, "commentsLoaded"], true);
    }

По окончанию загрузки комментариев, ставим статье статусы, что комментарии загружены.

Ну и осталось восстановить рендер в содержимого комментария в Comment и все будет работать:
return (
    <div>
      <h5>{comment.user}</h5>
      {comment.text}
    </div>
  );
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
24 нояб. 2024, в 03:11
500 руб./за проект
24 нояб. 2024, в 01:35
5000 руб./за проект
24 нояб. 2024, в 01:24
500 руб./за проект