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 setState
all'interno di componentDidUpdate
crea un ciclo infinito (che è ovvio)
Ho trovato una soluzione nell'uso getDOMNode
e 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>
);
}
});
componentDidUpdate
in questo violino .
componentShouldUpdate
?
setState
sarà sempre innescare una ri-renderizzare. Invece di controllarestate.top
e chiamaresetState
più volte, basta tenere traccia di ciò che si desiderastate.top
essere in una variabile locale, quindi una volta alla fine dellacomponentDidUpdate
chiamatasetState
solo se la variabile locale non corrispondestate.top
. Allo stato attuale, si reimposta immediatamentestate.top
dopo il primo rendering, che ti mette nel ciclo infinito.