React 는 어떻게 구성 요 소 를 지정 한 DOM 노드 에 렌 더 링 하 는 지 설명 합 니 다.
4729 단어 react.구성 요소 렌 더 링DOM 노드
알다 시 피 React 의 장점 중 하 나 는 그의 API 가 매우 간단 하 다 는 것 이다.render 방법 을 통 해 하나의 구성 요소 의 기본 구 조 를 되 돌려 줍 니 다.간단 한 함수 처럼 재 활용 가능 한 react 구성 요 소 를 얻 을 수 있 습 니 다.그러나 가끔 은 제한 이 있 습 니 다.특히 그의 API 에 서 는 구성 요소 가 과장 해 야 할 DOM 노드 를 제어 할 수 없어 서 일부 탄 층 구성 요 소 를 제어 하기 어렵 습 니 다.부모 요소 가
overflow:hidden
로 설정 되면 문제 가 발생 합 니 다.예 를 들 어 아래 와 같이:
우리 가 실제로 기대 하 는 효 과 는 이렇다.
다행히 뚜렷 하 지 는 않 지만 이 문 제 를 우회 하 는 상당히 우아 한 방법 이 있다.우리 가 배 운 첫 번 째 react 함 수 는 render 방법 입 니 다.그의 함수 서명 은 다음 과 같 습 니 다.
ReactComponent render(
ReactElement element,
DOMElement container,
[function callback]
)
일반적인 상황 에서 우 리 는 이 방법 을 사용 하여 전체 응용 을 DOM 노드 에 렌 더 링 합 니 다.좋 은 소식 은 이 방법 이 여기에 만 국 한 된 것 이 아니 라 는 것 이다.우 리 는 한 구성 요소 에서ReactDom.render
방법 으로 다른 구성 요 소 를 지정 한 DOM 요소 에 렌 더 링 할 수 있 습 니 다.구성 요소 의 render 방법 으로서 깨끗 해 야 합 니 다(예 를 들 어 state 를 바 꾸 거나 DOM 과 상호작용 할 수 없습니다).따라서 우 리 는 componentDidUpdate 나 componentDidMount 에서 호출ReactDom.render
방법 이 필요 합 니 다.또한 부모 요소 가 마 운 트 해제 되 었 을 때 구성 요소 도 마 운 트 해제 되 어야 합 니 다.
정리 하면 다음 구성 요 소 를 얻 을 수 있 습 니 다.
import React,{Component} from 'react';
import ReactDom from 'react-dom';
export default class RenderInBody extends Component{
constructor(p){
super();
}
componentDidMount(){// div body
this.popup = document.createElement("div");
document.body.appendChild(this.popup);
this._renderLayer();
}
componentDidUpdate() {
this._renderLayer();
}
componentWillUnmount(){// ,
ReactDom.unmountComponentAtNode(this.popup);
document.body.removeChild(this.popup);
}
_renderLayer(){// body div
ReactDom.render(this.props.children, this.popup);
}
render(){
return null;
}
}
요약 하면:componentDidMount 에 div 탭 을 수 동 으로 넣 은 다음 ReactDom.render 를 사용 하여 이 div 탭 에 구성 요 소 를 렌 더 링 합 니 다.
우리 가 구성 요 소 를 body 에 직접 렌 더 링 하고 싶 을 때,이 구성 요소 의 바깥쪽 에 RenderInBody 를 한 층 만 있 으 면 됩 니 다.
export default class Dialog extends Component{
render(){
return {
<RenderInBody>i am a dialog render to body</RenderInBody>
}
}
}
번역자 증가:상기 구성 요 소 를 개조 하면 우 리 는 지정 한 dom 노드 에 구성 요 소 를 렌 더 링 하고 마 운 트 해제 할 수 있 으 며 위치 제 어 를 추가 할 수 있 습 니 다.다음 과 같 습 니 다.
// body
import React,{Component} from 'react'
import ReactDom from 'react-dom';
export default class RenderInBody extends Component{
constructor(p){
super(p);
}
componentDidMount(){
/**
popupInfo={
rootDom:***,// DOM , document.body
left:***,//
top:***//
}
*/
let {popupInfo} = this.props;
this.popup = document.createElement('div');
this.rootDom = popupInfo.rootDom;
this.rootDom.appendChild(this.popup);
//we can setAttribute of the div only in this way
this.popup.style.position='absolute';
this.popup.style.left=popupInfo.left+'px';
this.popup.style.top=popupInfo.top+'px';
this._renderLayer()
}
componentDidUpdate() {
this._renderLayer();
}
componentWillUnmount(){
this.rootDom.removeChild(this.popup);
}
_renderLayer(){
ReactDom.render(this.props.children, this.popup);
}
render(){
return null;
}
}
주:위치 획득 과 근결 점 판단 함수
export default (dom,classFilters)=> {
let left = dom.offsetLeft,
top = dom.offsetTop + dom.scrollTop,
current = dom.offsetParent,
rootDom = accessBodyElement(dom);// body
while (current !=null ) {
left += current.offsetLeft;
top += current.offsetTop;
current = current.offsetParent;
if (current && current.matches(classFilters)) {
rootDom = current;
break;
}
}
return { left: left, top: top ,rootDom:rootDom};
}
/***
1. dom: dom , dom , ,
*
2. classFilters: DOM
/
주소 총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx 에서 사이트 아이콘 표시 설정전단 개발 환경: react:^16.4.1 webpack:^4.16.0 웹 팩 에 favicon. ico 설정 추가: nginx 는 ico 에 대한 지원 을 추가 합 니 다:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.