React крашится при обработке события onChange на элементе input
Есть "поисковая строка" которая представляет из себя обычный input с событием onChange, во время которого на сервер отправляется запрос через axios, получаем список найденных результатов в виде json и потом формируем сам список с подсказками.
Проблема в том что при вводе, удаления слова из input реакт крашится и все компоненты стираются, остается белый экран.
У меня не получилось повторить ошибку так, чтобы реакт прямо написал, что ошибка возникает при установке состояния. Но она возникает при установке состояния:
if(this.state.isMounted){
this.setState({
hints: renderedHints
});
}
Также хром сообщал об утечки памяти. Пробовал сделать трюк с isMounted, но ошибка все равно возникает.
class SocialControl extends React.Component{
//isMounted = false;
constructor(props){
super();
this.state = {
social: props.social,
isMounted: false,
groupMembersCount: false
};
//...
this.showHints = this.showHints.bind(this);
//перепривязываем контекст методов
}
componentDidMount(){
//this.isMounted = true;
this.setState({
isMounted: true
})
}
componentWillUnmount(){
//this.isMounted = false;
this.setState({
isMounted: false
})
}
async getHints(q){
let groupName = q;
return axios.get(`/api/vk/group/searchGroupByName?q=${groupName}`)
.then( response => {
return response.data;
})
.then(json => {
return json;
});
}
getGroupInfo(groupId){
return axios.get('/api/vk/group/getInfo?id=' + groupId)
.then( response => {
return response.data
})
.then( data => {
return data[0];
});
}
renderHints(hints){
let output = hints.map(hint => {
return(<li key={hint.id} data-id={hint.id}>{hint.name}</li>)
});
return output;
}
hideHints(){
let hintsBlock = document.querySelector(`.social-control__${this.state.social} .social-control__offers`);
let list = hintsBlock.querySelector('ul');
list.innerHTML = '';
hintsBlock.style.display = 'none';
}
async showHints(e){
let groupName = e.target.value;
let hints = await this.getHints(groupName);
let renderedHints = this.renderHints(hints);
if(this.state.isMounted){
this.setState({
hints: renderedHints
});
}
let hintsBlock = document.querySelector(`.social-control__${this.state.social} .social-control__offers`);
hintsBlock.style.display = 'block';
}
render(){
const hints = this.state.hints;
const membersCount = this.state.groupMembersCount;
let outputMembersCount = "";
if(membersCount){
outputMembersCount = `Подписчиков: ${this.state.groupMembersCount}`;
}
return(
<div className={`social-control__${this.state.social}`}>
<img src="https://cdn.worldvectorlogo.com/logos/vk-1.svg" alt=""/>
<div className="social-control__form">
<span className="social-control__name">{this.state.groupName}</span>
<div className="social-control__data">
<span className="social-control__members-count">
{outputMembersCount}
</span>
</div>
<input type="text"
onChange={this.showHints}
onBlur={this.hideHints}/>
<div className="social-control__offers">
<ul>
{this.state.hints}
</ul>
</div>
</div>
</div>
);
}
}