ฉันกำลังเขียนสคริปต์ที่เลื่อนลงด้านล่างหรือด้านบนของอินพุตขึ้นอยู่กับความสูงของดรอปดาวน์และตำแหน่งของอินพุตบนหน้าจอ นอกจากนี้ฉันต้องการตั้งค่าตัวปรับเปลี่ยนเป็นแบบเลื่อนลงตามทิศทางของมัน แต่ใช้setState
ภายในของการcomponentDidUpdate
สร้างลูปที่ไม่มีที่สิ้นสุด (ซึ่งเห็นได้ชัด)
ฉันพบวิธีแก้ปัญหาในการใช้getDOMNode
และการตั้งชื่อคลาสเป็นแบบเลื่อนลงโดยตรง แต่ฉันรู้สึกว่าควรมีวิธีแก้ปัญหาที่ดีกว่าโดยใช้เครื่องมือ React ใครสามารถช่วยฉัน?
นี่คือส่วนหนึ่งของรหัสการทำงานด้วยgetDOMNode
(ia ตรรกะการวางตำแหน่งที่ถูกละเลยเล็กน้อยเพื่อลดความซับซ้อนของรหัส)
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>
);
}
});
componentDidUpdate
ในซอนี้
componentShouldUpdate
?
setState
จะเสมอเรียกอีกครั้งทำให้ แทนที่จะตรวจสอบstate.top
และเรียกsetState
หลายครั้งเพียงติดตามสิ่งที่คุณต้องการstate.top
ที่จะอยู่ในตัวแปรท้องถิ่นแล้วครั้งหนึ่งในตอนท้ายของcomponentDidUpdate
การโทรเฉพาะในกรณีที่ตัวแปรท้องถิ่นของคุณไม่ตรงsetState
state.top
ตามที่แสดงในตอนนี้คุณจะรีเซ็ตทันทีstate.top
หลังจากการเรนเดอร์ใหม่ครั้งแรกซึ่งทำให้คุณอยู่ในวงวนที่ไม่มีที่สิ้นสุด