Я пишу сценарій, який переміщує спадне меню нижче або вище, залежно від висоти випадаючого місця та положення входу на екрані. Також я хочу встановити модифікатор до випадаючого відповідно до його напряму. Але використання 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