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 setStateInnere des verwenden, componentDidUpdateentsteht eine Endlosschleife (was offensichtlich ist).
Ich habe eine Lösung gefunden, getDOMNodeindem 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>
);
}
});
componentDidUpdatein dieser Geige an .
componentShouldUpdate?
setStatewird immer ausgelöst eine erneute machen. Anstatt mehrmals zu prüfenstate.topund aufzurufensetState, verfolgen Sie einfachstate.top, was Sie in einer lokalen Variablen sein möchten , und dann nur einmal am Ende descomponentDidUpdateAufrufssetState, wenn Ihre lokale Variable nicht übereinstimmtstate.top. So wie es jetzt ist, werden Sie sofortstate.topnach dem ersten erneuten Rendern zurückgesetzt, wodurch Sie in die Endlosschleife geraten.