Estoy escribiendo un script que mueve el menú desplegable por debajo o por encima de la entrada, dependiendo de la altura del menú desplegable y la posición de la entrada en la pantalla. También quiero configurar el modificador en el menú desplegable de acuerdo con su dirección. Pero usar setStatedentro de la componentDidUpdatecrea un bucle infinito (que es obvio)
He encontrado una solución al usar getDOMNodey configurar classname para desplegable directamente, pero creo que debería haber una mejor solución usando las herramientas React. Alguien puede ayudarme?
Aquí hay una parte del código de trabajo con getDOMNode(una lógica de posicionamiento un poco descuidada para simplificar el código)
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>
);
}
});
y aquí hay código con setstate (que crea un bucle 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>
);
}
});
componentDidUpdateen este violín .
componentShouldUpdate?
setStatehabrá siempre desencadenar una re-render. En lugar de verificarstate.topy llamarsetStatevarias veces, solo haga un seguimiento de lo que deseastate.topque esté en una variable local, luego una vez al final de lacomponentDidUpdatellamadasetStatesolo si su variable local no coincidestate.top. Tal como está ahora, reinicia inmediatamentestate.topdespués del primer renderizado, lo que lo coloca en el ciclo infinito.