Получить идентификатор из почтовых данных

Я хочу перенаправить на созданный элемент сразу после отправки. Пока у меня есть этот код:

class Person extends Component {
  constructor(props) {
    super(props);
    this.state = {
      personID: 0,
      description: "",
      phone: ""
    };

    this.handleInputChange = this.handleInputChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.modifyPersonID = this.modifyPersonID .bind(this);
  }

  handleInputChange(event) {
    const target = event.target;

    const value = target.value;
    const name = target.name;

    this.setState({
      [name]: value
    });
  }

  modifyPersonID(idx) {
    this.setState({ personID: idx });
    var ruta = "/persons/" + idx + "/";
    return <Redirect to = {ruta} />;
  }

  fetchData(event) {
    let idx = "";
    event.preventDefault();
    const body= {
      description: event.target.elements.descripcion.value,
      phone: event.target.elements.phone.value
    };
    fetch("http://api/", {
      method: "post",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(body)
    })
      .then(function(response) {
        return response.json();
      })
      .then(function(data) {
        idx = data.id;
      });
    return idx;
  }

  handleSubmit(event) {
    let ruta = "/persons/";
    event.preventDefault();
    let id = this.fetchearData(event);
    this.setState({ personID: id });
    this.modifyID(id);
  }
}

Когда я пытаюсь перенаправить на /persons/:id, команда setState для идентификатора выполняется после перенаправления на /persons/:id, поэтому она перенаправляется на /persons/0. Как я могу установить состояние сразу после того, как оператор post вернет идентификатор?

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

Ответы 3

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

Рассмотрите возможность возврата обещания вместо идентификатора в методе fetchData. Если это не работает для вас, вы можете попробовать использовать Ждите

this.setState принимает функцию обратного вызова в качестве второго аргумента.

  modifyPersonID(idx) {
    this.setState({ personID: idx },()=>{
      var ruta = "/persons/" + idx + "/";
      return <Redirect to = {ruta} />;
    });
  }

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

Чтобы вызвать какую-либо функцию после setState, вы должны использовать callback in setState.

Также используйте async/await для вызова API,

async handleSubmit(event) {
    let ruta = "/persons/"; //Remove this line 
    event.preventDefault();
    let id = await this.fetchearData(event);
    this.setState({ personID: id }, ()=> <Redirect to = {`/person/${id}`} />); 
    this.modifyID(id); //Remove this line and modifyID function as well
  }

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