@aznhautroalvyl

Заполнить поле input из json-а?

В компонент приходит значение id, по которому необходимо вывести в input соответствующее ему значение. Данные для заполнения приходят с fetch запроса и хранятся в виде {id: 1, value: 'Test'}.
По факту input остаётся пустым.
Пробовал добавлять async / await - не получилось

Исходный компонент:
class TestPage extends Component {
  constructor(props) {
    this.state = {     
      data: []
    };   
  }

  async componentDidMount() {  
    this.getValueForInput();
  }

  getValueForInput() { 
    this.onHandleFetch(this.props.params.idValue); // передача id
    console.log(this.state.data); // здесь не выводятся данные
    return this.state.data.value; // возвращаем значение, полученное по id
  }

  onHandleFetch(id) {
    fetch( ... )
      .then(newData =>
        this.setState({ data: newData }) // получаем значение вида [{id: 1, value: 'Test'}]
      );
  }

  render() {
    console.log(this.state.data); // здесь выводятся данные
    return (
     ...
              <InputForm getValueForInput={this.getValueForInput} data={this.state.data}
     ...        
}


Input:
class InputForm extends Component {
  constructor(props) {
    super(props);
    this.state = {
      value1: ''
    };
    ...
  }

  componentDidMount() {
    this.setValue(); // установить значение в input
  }

  setValue() {
    console.log(this.props.getValueForInput()); // ничего нет
    this.setState({ value1: this.props.getValueForInput() });   
  }

  render() {
   ...
            <input  type='text' required value={this.state.value1}  />       
 ... }    
InputForm.propTypes = {
  getValueForInput: PropTypes.func,
  data: PropTypes.array
};      
}
  • Вопрос задан
  • 643 просмотра
Решения вопроса 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Не надо копировать пропсы компонента в локальный state. Уберите setValue, просто работайте с данными props.data реактивно.
К тому же, у вас onHandleFetch - это асинхронный метод, а вы пытаетесь получить результат его работы сразу
getValueForInput() { 
    this.onHandleFetch(this.props.params.idValue); // передача id
    console.log(this.state.data); // здесь не выводятся данные
    return this.state.data.value; // тут тоже не получается значение, т.к. onHandleFetch его еще не успел подготовить
  }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы