Я пишу сценарий, который перемещает раскрывающийся список ниже или выше ввода в зависимости от высоты раскрывающегося списка и положения ввода на экране. Также я хочу установить модификатор для раскрывающегося списка в соответствии с его направлением. Но использование setState
внутри componentDidUpdate
создает бесконечный цикл (что очевидно)
Я нашел решение в использовании getDOMNode
и настройке имени класса в раскрывающемся списке напрямую, но я считаю, что должно быть лучшее решение с использованием инструментов React. Кто-нибудь может мне помочь?
Вот часть рабочего кода с getDOMNode
(например, немного упущенной логикой позиционирования для упрощения кода)
let SearchDropdown = React.createClass({
componentDidUpdate(params) {
let el = this.getDOMNode();
el.classList.remove('dropDown-top');
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
el.classList.add('dropDown-top');
}
},
render() {
let dataFeed = this.props.dataFeed;
return (
<DropDown >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
и вот код с setstate (который создает бесконечный цикл)
let SearchDropdown = React.createClass({
getInitialState() {
return {
top: false
};
},
componentDidUpdate(params) {
let el = this.getDOMNode();
if (this.state.top) {
this.setState({top: false});
}
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
if (!this.state.top) {
this.setState({top: true});
}
}
},
render() {
let dataFeed = this.props.dataFeed;
let class = cx({'dropDown-top' : this.state.top});
return (
<DropDown className={class} >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
componentDidUpdate
в этой скрипке .
componentShouldUpdate
?
setState
будет выполняться повторный рендеринг. Вместо того, чтобы проверять и вызывать несколько раз, просто отслеживайте, что вы хотите видеть в локальной переменной, а затем один раз в конце вызова, только если ваша локальная переменная не совпадает . В его нынешнем виде вы сразу же перезагружаетесь после первого повторного рендеринга, что помещает вас в бесконечный цикл.state.top
setState
state.top
componentDidUpdate
setState
state.top
state.top