У меня есть компонент класса:
class App extends Component {
constructor(props){
super(props);
this.state = {
abc: '',
someQuery: ''
}
this.handleSubmit = this.handleSubmit.bind(this);
this.handleChangeEvent = this.handleChangeEvent.bind(this);
}
componentDidUpdate(){
fetch(`/someLink/${this.state.abc}`)
.then(response => {
return response.json();
}).then(data => {
this.setState({
someQuery: data.xxx
});
});
}
handleSubmit(e){
const target = e.target;
const value = target.value;
this.setState({
abc: value
})
e.preventDefault();
};
handleChangeEvent(e){
const target = e.target;
const value = target.value;
this.setState({
abc: value
});
};
render(){
return(
<form onSubmit = {this.handleSubmit}>
<input name='abc' value = {this.state.abc} onChange = {this.handleChangeEvent} />
<input type = "submit" value = "Submit" />
</form>
<div>{this.state.abc} is currently accessing data from {this.state.someQuery}</div>
)
}
}
Как мне запускать componentDidUpdate() каждый раз, когда я обновляю значение поля ввода и нажимаю кнопку отправки?
Вышеупомянутое вызывает жизненный цикл, но из-за setState в handleChangeEvent() жизненный цикл вызывается в тот момент, когда я что-то набираю, и не дожидается нажатия кнопки отправки.
Удаление setState из handleChangeEvent() делает значение поля ввода недоступным для редактирования (невозможно ввести в поле ввода).
Мне нужно, чтобы значение поля ввода было добавлено к api link в жизненном цикле, но я не могу понять, как это сделать.
Почему бы не добавить условие в componentDidMount, чтобы узнать, была ли форма отправлена или нет?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете добавить любой метод в класс компонента и вызвать его при отправке. componentDidUpdate - неподходящее место для таких вещей, особенно установка состояния - это преступление: D
class App extends Component {
constructor(props){
super(props);
this.state = {
abc: '',
someQuery: ''
}
this.handleSubmit = this.handleSubmit.bind(this);
this.handleChangeEvent = this.handleChangeEvent.bind(this);
}
doSommething (value){
fetch(`/someLink/${value}`)
.then(response => {
return response.json();
}).then(data => {
this.setState({
someQuery: data.xxx
});
});
}
handleSubmit(e){
const target = e.target;
const value = target.value;
this.setState({
abc: value
})
e.preventDefault();
doSommething(value);
};
handleChangeEvent(e){
const target = e.target;
const value = target.value;
this.setState({
abc: value
});
};
render(){
return(
<form onSubmit = {this.handleSubmit}>
<input name='abc' value = {this.state.abc} onChange = {this.handleChangeEvent} />
<input type = "submit" value = "Submit" />
</form>
<div>{this.state.abc} is currently accessing data from {this.state.someQuery}</div>
)
}
}Я где-то читал, что выборка api должна вызываться в жизненном цикле `componentDidUpdate ', поэтому я выбрал исходный подход, описанный выше. Спасибо за помощь Zohaib.
@AndrewL Нет, это componentDidMount, а не componentDidUpdate. и это для случаев, когда вы хотите получить данные из api, которые будут отображаться в ближайшее время, но не для таких вызовов api, которые будут часто извлекаться при каком-либо щелчке или каком-либо событии. Используйте простой способ, как в вашем коде onSubmit
Итак, для API, который не отображает данные мгновенно, я должен использовать componentDidMount?
@AndrewL Нет, извините за неправильный выбор слов. позволь мне объяснить. например если вы хотите показать список пользователей, и данные будут поступать из api, вам необходимо получить данные в componentDidMount, вызвав многократно используемый метод, который фактически будет извлекать данные из api. и вы можете вызвать этот многоразовый метод позже в каком-то событии, например, при удалении пользователя, который обновит данные списка пользователей
Ох, хорошо. Спасибо за объяснение Zohaib
Используйте defaultValue вместо value во вводе.