Reactjs - Невозможно отобразить в моем компоненте значения this.state.item из моего api сервлета

Из моего приложения ReactJS я отправляю JSONRequest во внешнюю систему через сервлет Java и получаю ответ от этого сервлета. Этот ответ я должен установить в моем компоненте React.

Но у меня проблема. Я не могу установить значения для самого первого ответа. Если я вручную обновляю страницу, эти значения устанавливаются правильно. И затем, если я отправляю запрос во второй раз с теми же значениями формы, в этот раз я могу отобразить значения ответа без какого-либо ручного обновления.

Во время самого первого ответа формы я не могу установить значение ответа.

Пожалуйста, найдите мой код ниже, который я пытаюсь.

class Orders extends React.Component {
  constructor(props) {
    super(props);
    this.publishToOracle = this.publishToOracle.bind(this);
  }

  publishToOracle(id) {
    var item=this.state.item;
    ajax({
      url: 'api/publish_oracle',
      method: 'POST',
      data: { id: id }

    },
   (data) => {
     if (data.error == null) {
       alert('Order has been published to Oracle Successfully') 
       item.oracle_number=data.result.oracle_number;
       this.setState({ view: 'Details', item: data.result});
       console.info("Order Number-->"+JSON.stringify(this.state.item.oracle_number)); // Oracle Number is printing here every time. But not in the component.
     } else if (data.error != null) {
       alert(data.error);
     }
   });
  }


  render() {
    if (this.state.view == 'Details') {
      return (
        <Details
          item = { this.state.item }
          publishToOracle = {this.publishToOracle}
        />
      );
    }
  }
}



class Details extends React.Component {
  constructor(props) {
    super(props);
    this.state = { item: props.item };
  }

  handlePublishToOracle(e) {
    var item = this.state.item;
    alert("Publishing to Oracle");
    e.preventDefault();
    item["oracle_order_number"] = "";
    item["oracle_response_message"] = "";
    item["oracle_response_status"] = "";
    this.props.publishToOracle(item.id);
 }

 handleActionButtons() {
   if (this.state.action == "PublishToOracle") {
     return (
       <button
         type = "submit"
         onClick = { this.handlePublishToOracle}
       >
         Publish To Oracle
       </button>
     );
   }
  }

  render() {
    return (
      <select
        name = "action"
        value = {this.state.action}
        onChange = {this.handleAction}
      >
        <option value = "PublishToOracle"> Publish To Oracle</option>
      </select>
      { this.handleActionButtons() }
      <input
        name = "oracle_number"
        type = "text"
        maxLength = "20"
        value = { this.state.item.oracle_number }
      />
     );
   }
}

Фактически, функциональность API заключается в том, чтобы получить ответ, сохранить его в моей MongoDB и отобразить в React UI.

Что означает «Я не могу установить значения для самого первого ответа»? Вы ожидали увидеть на странице тег <Details>?

boaz_shuster 11.03.2018 09:05

@boaz_shuster - Найдите скриншот. this.state.item.order_number во время самого первого API формы ответа. Значение не отображается в этом компоненте. А когда обновляю страницу, она заполняется.

Karthikeyan 11.03.2018 09:08

Вы передаете publishToOracle в Details, но затем получаете доступ к publishToOracleEBS

G4bri3l 11.03.2018 09:12

@ G4bri3l - Извините, это была опечатка, которую сейчас исправили.

Karthikeyan 11.03.2018 09:15

Странно. Потому что я думал, что при первом рендеринге обещание не завершено, что означает, что элемент не определен. Таким образом, вы должны были получить сообщение об ошибке «элемент не определен», но почему-то этого не произошло.

boaz_shuster 11.03.2018 09:23

Да, в этом мое замешательство. Или., После успешного запроса API., Как мне повторно отрендерить страницу. Потому что я могу видеть ответ, хранящийся в Mongo.

Karthikeyan 11.03.2018 09:36

Откуда взялся метод ajax? Метод render в классе Orders является побочной функцией, он возвращает только иногда, что является действительно плохой структурой. publishToOracle - это функция обратного вызова в Details, но без рендеринга Details невозможно получить доступ к этой функции. button не нуждается в type = "submit", поскольку вам нравится управлять его поведением в js и preventDefault.

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

Ответы 1

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

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

 item["oracle_order_number"] = "";
 item["oracle_response_message"] = "";
 item["oracle_response_status"] = "";
 this.props.publishToOracleEBS(item);

Это решение было обновлено и в моих вопросах.

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