Ich schreibe ein Skript, das die Dropdown-Liste je nach Dropdown-Höhe und Position der Eingabe auf dem Bildschirm unter oder über die Eingabe verschiebt. Außerdem möchte ich den Modifikator entsprechend seiner Richtung auf Dropdown setzen. Wenn Sie jedoch das setState
Innere des verwenden, componentDidUpdate
entsteht eine Endlosschleife (was offensichtlich ist).
Ich habe eine Lösung gefunden, getDOMNode
indem ich den Klassennamen direkt als Dropdown-Liste verwendet und festgelegt habe, aber ich bin der Meinung, dass es mit den React-Tools eine bessere Lösung geben sollte. Kann mir jemand helfen?
Hier ist ein Teil des Arbeitscodes mit getDOMNode
(ua etwas vernachlässigte Positionierungslogik zur Vereinfachung des Codes)
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>
);
}
});
und hier ist Code mit setstate (der eine Endlosschleife erzeugt)
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
in dieser Geige an .
componentShouldUpdate
?
setState
wird immer ausgelöst eine erneute machen. Anstatt mehrmals zu prüfenstate.top
und aufzurufensetState
, verfolgen Sie einfachstate.top
, was Sie in einer lokalen Variablen sein möchten , und dann nur einmal am Ende descomponentDidUpdate
AufrufssetState
, wenn Ihre lokale Variable nicht übereinstimmtstate.top
. So wie es jetzt ist, werden Sie sofortstate.top
nach dem ersten erneuten Rendern zurückgesetzt, wodurch Sie in die Endlosschleife geraten.