Tôi đang viết một tập lệnh di chuyển thả xuống bên dưới hoặc bên trên đầu vào tùy thuộc vào chiều cao của danh sách thả xuống và vị trí của đầu vào trên màn hình. Ngoài ra tôi muốn đặt modifier thành dropdown theo hướng của nó. Nhưng sử dụng setStatebên trong componentDidUpdatetạo ra một vòng lặp vô hạn (đó là điều hiển nhiên)
Tôi đã tìm thấy một giải pháp trong việc sử dụng getDOMNodevà đặt trực tiếp tên lớp xuống, nhưng tôi cảm thấy rằng nên có một giải pháp tốt hơn bằng các công cụ React. Ai có thể giúp tôi?
Đây là một phần của mã làm việc với getDOMNode(logic định vị bị bỏ qua một chút để đơn giản hóa mã)
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>
);
}
});
và đây là mã với setstate (tạo ra một vòng lặp vô hạn)
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>
);
}
});
componentDidUpdatetrong fiddle này .
componentShouldUpdate?
setStatesẽ luôn kích hoạt kết xuất lại. Thay vì kiểm trastate.topvà gọisetStatenhiều lần, chỉ cần theo dõi những gì bạn muốnstate.topở một biến cục bộ, sau đó một lần vào cuốicomponentDidUpdatecuộc gọisetStatechỉ khi biến cục bộ của bạn không khớpstate.top. Vì nó đứng ngay bây giờ, bạn ngay lập tức thiết lập lạistate.topsau lần kết xuất lại đầu tiên, điều này đặt bạn vào vòng lặp vô hạn.