最佳答案
我正在写一个脚本,根据下拉框的高度和输入框在屏幕上的位置,将下拉框移动到输入框的下方或上方。我还想设置修饰符下拉根据其方向。
但是在 componentDidUpdate
内部使用 setState
会创建一个无限循环(这是显而易见的)
我发现了一个解决方案,使用 getDOMNode
和设置 classname 直接下拉,但我觉得应该有一个更好的解决方案使用反应工具。有人能帮我吗?
下面是使用 getDOMNode
(i
为了简化代码而忽略的定位逻辑)
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>
);
}
});
下面是 setstate 代码(它创建了一个无限循环)
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>
);
}
});