Мне нужно обновить API внутри componentDidMount после того, как я setState в рендере

Я вызвал API, используя выборку внутри componentDidMount, но мне нужно, чтобы URL-адрес API менялся в соответствии с состоянием, которое я установил в textInput.

Я вижу, что мое состояние меняется в console.info(), но кажется, что оно не меняется внутри componentDidMount.

constructor(props) {
    super(props)
    this.state = {
      codigoCarro: "", //this is the state i need to change
    }
  } 

 componentDidMount() {

fetch
(`https://parallelum.com.br/fipe/api/v1/carros/marcas/${this.state.codigoCarro}/modelos`) //i need the state to change here
      .then((response) => response.json())
      .then((responseJson) => {
        this.setState({
          modeloCarro: responseJson.modelos
        })
      })
      .catch((error) => {
        console.info(error)
      })
  }

 render() {
      return (
              <Text>Please insert the number informed in the input below</Text>
              <TextInput
                placeholder = "Código da marca"
                onChangeText = {(codigoCarro) => { 
                  this.setState({ codigoCarro }); 
                }}
              />


      );
    }
modeloCarroне в штате
Héctor 15.05.2019 09:26

нет ввода, нет обработчика изменений, не setState в рендере - читать документы

xadm 15.05.2019 09:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Возможно, стоит прочитать React документация для componentDidMount(), так как эта функция вызывается только после того, как компонент вставлен в дерево dom, что означает, что она не будет вызываться каждый раз, когда ваше состояние обновляется.

Возможно, вы ищете функцию componentDidUpdate(), которая вызывается после каждого рендеринга, однако я бы все же прочитал документацию, поскольку вы можете ввести чрезмерные запросы netowrk, изменив это.

Конечный продукт может выглядеть примерно так:

componentDidUpdate(prevProps, prevState) {

    if (prevState.codigoCarro == this.state.codigoCarro) return;

    fetch
    (`https://parallelum.com.br/fipe/api/v1/carros/marcas/${this.state.codigoCarro}/modelos`) //i need the state to change here
        .then((response) => response.json())
        .then((responseJson) => {
            this.setState({
                modeloCarro: responseJson.modelos
            })
        })
        .catch((error) => {
            console.info(error)
        })
}

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