Sto scrivendo uno script che sposta il menu a discesa sotto o sopra l'input a seconda dell'altezza del menu a discesa e della posizione dell'input sullo schermo. Inoltre voglio impostare il modificatore sul menu a discesa in base alla sua direzione. Ma l'uso setStateall'interno di componentDidUpdatecrea un ciclo infinito (che è ovvio)
Ho trovato una soluzione nell'uso getDOMNodee nell'impostazione del nome classe per il menu a discesa direttamente, ma sento che dovrebbe esserci una soluzione migliore utilizzando gli strumenti React. Qualcuno può aiutarmi?
Ecco una parte del codice di lavoro con getDOMNode(tra cui una logica di posizionamento un po 'trascurata per semplificare il codice)
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>
);
}
});
e qui c'è il codice con setstate (che crea un ciclo infinito)
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 questo violino .
componentShouldUpdate?
setStatesarà sempre innescare una ri-renderizzare. Invece di controllarestate.tope chiamaresetStatepiù volte, basta tenere traccia di ciò che si desiderastate.topessere in una variabile locale, quindi una volta alla fine dellacomponentDidUpdatechiamatasetStatesolo se la variabile locale non corrispondestate.top. Allo stato attuale, si reimposta immediatamentestate.topdopo il primo rendering, che ti mette nel ciclo infinito.