Повторная визуализация после запроса POST и PUT

У меня есть приложение, которое получает данные из REST API. Я могу получить данные. Мне также нужно иметь возможность отправлять данные POST в API и вносить изменения в API. Мой код может успешно выполнять все эти операции, однако мне нужно обновить страницу, чтобы увидеть представленные материалы. Проблема, с которой я сталкиваюсь, связана с автоматическим повторным рендерингом страницы при отправке. Я знаю, что мне нужно либо установить состояние, либо обновить API после вызова. Я не знаю, как структурировать это, хотя. Какие-либо предложения?

import React, { Component } from 'react';
import './App.css';

 class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      dataSource: [],
      isLoaded: false,
    }
    this.editBeersLikes = this.editBeersLikes.bind(this);
    this.addNewBeer = this.addNewBeer.bind(this);
  }

   seeBeers() {
   return fetch("https://beer.fluentcloud.com/v1/beer/")//specify id number to show single beer ex. "https://beer.fluentcloud.com/v1/beer/99"
     .then(response => response.json())
     .then(responseJson => {
       this.setState({
         isLoaded: true,
         dataSource: responseJson,
       });
       return responseJson;
     })
     .catch(error => console.info(error)); //to catch the errors if any
 }

   addNewBeer() {
    fetch("https://beer.fluentcloud.com/v1/beer/", {
      body: "{\"name\":\"\",\"likes\":\"\"}",//input beer name and like amount ex "{\"name\":\"Michelob Ultra\",\"likes\":\"-5\"}"
      headers: {
        "Content-Type": "application/json"
      },
      method: "POST"
      })
      console.info("Beer Added!");
  }

   editBeersLikes() {
    fetch("https://beer.fluentcloud.com/v1/beer/99", {//must specify id number to edit a single beer's likes ex "https://beer.fluentcloud.com/v1/beer/99"
          body: "{\"likes\":\"\"}", //input amount of likes to edit ex "{\"likes\":\"22\"}"
          headers: {
            "Content-Type": "application/json",
            "Accept": "application/json"
          },
          method: "PUT"
          })
          console.info("Likes Successfully Updated!");
        }

         componentDidMount() {
          this.seeBeers();
          //this.editBeersLikes(); //uncomment when you want to edit likes
          //this.addNewBeer();  //uncomment when you want to add beers
        }


   render() {
    return (
      <div className = "App">
      <h1>What is in My Fridge?</h1>

         <ul>
          {this.state.dataSource.map(dataSource => {
            return <li key = {`dataSource-${dataSource.id}`}>{dataSource.name} | {dataSource.likes}</li>
          })}
        </ul>

       </div>
    );
  }
}

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

Ответы 1

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

Самый простой способ, вероятно, повторно получить данные после того, как вы успешно отправили или поместили их на сервер. Это также был бы самый чистый и наименее подверженный ошибкам способ, потому что вы всегда получаете свежий ответ от сервера с самым последним набором данных.

Однако вы можете использовать шаблон, который часто называют «оптимистичным пользовательским интерфейсом», что означает, что вы сохраняете два состояния: текущее состояние и состояние, как оно будет выглядеть если запрос сервера успешен. Затем вы переместите новый или обновленный элемент в свое состояние dataSource и отобразите его в своем пользовательском интерфейсе, но вернете его в старое состояние до запроса сервера, если запрос не будет выполнен.

Недостатком последнего подхода является то, что иногда вы не знаете всех данных (особенно автоматически сгенерированных идентификаторов или полей lastUpdated) без повторного запроса к серверу.

Поэтому, если вам нужно относительно простое, ясное и надежное решение, вы можете вызывать this.seeBeers() после каждого запроса POST/PUT для получения обновленного набора данных.

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

ДАСССС!!! Большое спасибо. this.seeBeers(); функция работала отлично!! Еще одно: в моем методе componentWillMount я должен закомментировать this.editBeersLIkes и this.addNewBeers. Есть ли более подходящий способ предотвратить их выполнение? –

dksmith328 09.04.2019 22:34

Зачем они вообще нужны в componentDidMount? В типичном приложении вы будете вызывать их после того, как пользователь взаимодействует с вашим пользовательским интерфейсом, например. заполнив форму, чтобы добавить новые сорта пива, или нажав какую-то кнопку «нравится», чтобы добавить лайк. Метод componentDidMount обычно используется для выборки данных, регистрации таймеров или событий и т. д. Использование его для инициации операций записи (таких как POST или PUT) было бы довольно необычным.

Manuel Bieh 09.04.2019 23:43

Хорошо, это имеет смысл. Спасибо за вашу помощь в этом вопросе.

dksmith328 09.04.2019 23:52

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