짧은 대답:
React는 ref가 componentDidMount
또는 componentDidUpdate
hooks 이전에 설정되도록 보장합니다 . 그러나 실제로 렌더링 된 어린이에게만 해당 됩니다 .
componentDidMount() {
}
componentDidUpdate() {
}
render() {
return <div ref={/* ... */} />;
}
이것이 "React는 이러한 후크가 실행되기 전에 항상 모든 참조를 설정 합니다 "를 의미하지는 않습니다 .
참조 가 설정 되지 않은 몇 가지 예를 살펴 보겠습니다 .
렌더링되지 않은 요소에 대한 참조가 설정되지 않습니다.
React는 render에서 실제로 반환 한 요소에 대해서만 ref 콜백을 호출 합니다.
이것은 코드가
render() {
if (this.state.isLoading) {
return <h1>Loading</h1>;
}
return <div ref={this._setRef} />;
}
그리고 처음 this.state.isLoading
입니다 true
당신이해야 하지 기대 this._setRef
하기 전에 호출 할 componentDidMount
.
이것은 의미가있을 것입니다 : 만약 당신의 첫 번째 렌더가 반환 되었다면 <h1>Loading</h1>
React가 어떤 다른 조건에서 ref가 첨부되어야하는 다른 것을 반환한다는 것을 알 수있는 방법이 없습니다. 또한이 없다 :에 심판 설정하는 것도<div>
때문에 요소가 작성되지 않았습니다 render()
방법은 렌더링되지 않을 것이라고 말했다는.
따라서이 예에서는 만 componentDidMount
실행됩니다. 그러나 경우 this.state.loading
에 변경false
, 당신은 볼 것이다 this._setRef
첫째 부착 한 다음 componentDidUpdate
실행됩니다.
다른 구성 요소에주의
참고 것을 당신이 다른 구성 요소에 이르기까지 심판 어린이를 전달하는 경우 가 방지 렌더링 (그리고 문제로 인해) 뭔가를하고있는 기회가있다.
예를 들면 다음과 같습니다.
<MyPanel>
<div ref={this.setRef} />
</MyPanel>
출력에 MyPanel
포함하지 않으면 작동 하지 않습니다 props.children
.
function MyPanel(props) {
return <h1>Oops, no refs for you today!</h1>;
}
다시 말하지만, 그것은 버그가 아닙니다 : DOM 요소가 생성되지 않았기 때문에 React가 ref를 설정할 아무것도 없을 것입니다 .
참조가 중첩으로 전달되는 경우 수명주기 전에 설정되지 않습니다. ReactDOM.render()
이전 섹션과 마찬가지로 ref가있는 자식을 다른 구성 요소에 전달하면이 구성 요소가 시간 내에 참조를 첨부하지 못하게하는 작업을 수행 할 수 있습니다.
예를 들어에서 자식을 반환하지 render()
않고 대신 ReactDOM.render()
수명주기 후크를 호출 할 수 있습니다. 여기 에서 이에 대한 예를 찾을 수 있습니다 . 이 예에서는 다음을 렌더링합니다.
<MyModal>
<div ref={this.setRef} />
</MyModal>
그러나 MyModal
수행 ReactDOM.render()
에 호출 의 componentDidUpdate
수명주기 방법 :
componentDidUpdate() {
ReactDOM.render(this.props.children, this.targetEl);
}
render() {
return null;
}
React 16 이후 로 수명주기 동안 이러한 최상위 렌더링 호출은 전체 트리에 대해 수명주기가 실행될 때까지 지연됩니다 . 이것은 왜 당신이 시간에 첨부 된 심판을 보지 못하는지 설명 할 것입니다.
이 문제에 대한 해결책 은 중첩 된 호출 대신 포털 을 사용하는
것입니다 ReactDOM.render
.
render() {
return ReactDOM.createPortal(this.props.children, this.targetEl);
}
이렇게 <div>
하면 참조가있는 우리 가 실제로 렌더링 출력에 포함됩니다.
따라서이 문제가 발생하면 구성 요소와 참조 사이에 자식 렌더링을 지연시킬 수있는 요소가 없는지 확인해야합니다.
참조 setState
를 저장 하는 데 사용하지 마십시오.
setState
ref 콜백에 ref를 저장하는 데 사용 하고 있지 않은지 확인하십시오. 이는 비동기적이고 "완료"되기 전에 componentDidMount
먼저 실행될 것입니다.
여전히 문제가 있습니까?
위의 팁 중 어느 것도 도움이되지 않는 경우 React에 문제를 제출하면 살펴 보겠습니다.
this
클래스 외부의 어휘 범위에서 값을 캡처합니다 . 클래스 메서드에 대한 화살표 함수 구문을 제거하고 도움이되는지 확인하십시오.