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 setState
bên trong componentDidUpdate
tạ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 getDOMNode
và đặ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>
);
}
});
componentDidUpdate
trong fiddle này .
componentShouldUpdate
?
setState
sẽ luôn kích hoạt kết xuất lại. Thay vì kiểm trastate.top
và gọisetState
nhiề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ốicomponentDidUpdate
cuộc gọisetState
chỉ 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.top
sau 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.