드롭 다운의 높이와 화면의 입력 위치에 따라 드롭 다운을 입력의 위 또는 아래로 이동시키는 스크립트를 작성 중입니다. 또한 방향에 따라 수정자를 드롭 다운하도록 설정하고 싶습니다. 그러나 setState
내부를 사용 componentDidUpdate
하면 무한 루프 가 생성됩니다 (명백합니다)
getDOMNode
클래스 이름을 사용 하고 드롭 다운으로 직접 설정 하는 솔루션을 찾았 지만 React 도구를 사용하는 더 나은 솔루션이 있어야한다고 생각합니다. 아무도 나를 도울 수 있습니까?
다음은 작업 코드의 일부입니다 getDOMNode
(코드를 단순화하기 위해 약간 무시한 위치 지정 논리)
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>
);
}
});
componentShouldUpdate
습니까?
setState
은 항상 다시 렌더링을 트리거하는 것 입니다. 여러 번 확인state.top
하고 호출setState
하는 대신state.top
로컬 변수에 포함 하려는 항목 을 추적 한 다음 로컬 변수가 일치하지 않는 경우에만componentDidUpdate
호출 이 끝날 때 한 번만 추적setState
하십시오state.top
. 지금 당장,state.top
첫 번째 다시 렌더링 후 즉시 재설정 하면 무한 루프가 발생합니다.