Vue 에서 fragment.js 사용 방법 에 대한 상세 한 설명
6345 단어 Vuefragment.js
createDocumentFragment
한 노드 에 여러 요 소 를 한꺼번에 삽입 하려 면 어떻게 해 야 합 니까?예 를 들 어 한 번 에 10000 개의 노드 를 삽입 하 는 것 입 니까?
가장 간단 하고 거 친 방법 은:
var parent = document.getElementById('parent');
for(var i = 0; i < 10000; i++) {
var child = document.createElement('div');
var text = document.createTextNode('' + i);
child.appendChild(text);
parent.appendChild(child);
}
그러나 DOM 에 대한 반복 적 인 조작 은 페이지 를 다시 그 리 며 환류 시 켜 효율 이 매우 낮 고 페이지 가 걸 려 죽 을 수 있 기 때문에 이 코드 는 기본적으로 아무 도 사용 하지 않 는 다.DOM 작업 을 단계별 로 진행 하면 카드 가 끊 기 는 페이지 를 피 할 수 있 습 니 다.js 닌 자 비적 에 서 는 setTimeout 으로 개선 할 수 있다 고 언급 한 적 이 있 습 니 다.
var i = 0, max = 10000;
setTimeout(function addNodes() {
for(var step = i + 500; i < step; i++) {
var child = document.createElement('div');
child.appendChild(document.createTextNode('' + i));
div.appendChild(child);
}
if(i < max) {
setTimeout(addNodes, 0);
}
}, 0);
물론 메모리 에서 노드 를 직접 조작 하고 모든 노드 를 한데 모 은 후에 DOM 트 리 와 상호작용 을 하고 모든 노드 를 하나의 div 에 연결 한 다음 에 div 를 DOM 트 리 에 걸 어야 한다.
var parent = document.getElementById('parent');
var div = document.createElement('div');
for(var i = 0; i < 10000; i++) {
var child = document.createElement('div');
var text = document.createTextNode('' + i);
child.appendChild(text);
div.appendChild(child);
}
parent.appendChild(div);
예 를 들 어 DOM 트 리 와 한 번 만 상호작용 을 하면 성능 이 크게 개 선 될 것 입 니 다.그러나 div 를 추가 로 삽 입 했 습 니 다.div 와 같은 노드 와 상호작용 을 하지 않 았 다 면 예 를 들 어 table 에 th,td 를 삽입 하 는 것 입 니까?이때 createDocumentFragment 가 나 서 야 합 니 다."문서 세 션"이 라 고 번역 하고 MDN 의 설명 을 누 르 십시오.
DocumentFragments 는 DOM 노드 입 니 다.그것들 은 DOM 나무의 일부분 이 아니다.일반적인 사용 장면 은 문서 세 션 을 만 든 다음 에 만 든 DOM 요 소 를 문서 세 션 에 삽입 하고 마지막 으로 문서 세 션 을 DOM 트 리 에 삽입 하 는 것 입 니 다.DOM 트 리 에서 문서 세 션 은 모든 하위 요소 로 대 체 됩 니 다.
문서 세 션 이 존재 하고 메모리 에 있 기 때문에 DOM 트 리 에 있 지 않 기 때문에 하위 요 소 를 문서 세 션 에 삽입 할 때 페이지 의 회 류 를 일 으 키 지 않 습 니 다(요소 위치 와 기하학 적 계산).따라서 문서 세 션 document fragments 를 사용 하면 성능 을 최적화 하 는 역할 을 합 니 다.
쉽게 말 하면 위의 예 는 div 에서 버 전 을 바 꾸 지 않 아 도 됩 니 다.삽입 할 때 하위 요소 로 그 자 체 를 바 꾸 는 것 이 완벽 합 니 다.
'좋 은 것 도 통용 되 지 않 는 다'(특히 한 회사 의 브 라 우 저 를 대상 으로)고 하지만 이 좋 은 물건 은 IE6 까지 지원 한다.
구체 적 인 코드 는 대략 이렇게 생 겼 다.
var parent = document.getElementById('parent');
var frag = document.createDocumentFragment();
for(var i = 0; i < 10000; i++) {
var child = document.createElement('div');
var text = document.createTextNode('' + i);
child.appendChild(text);
frag.appendChild(child);
}
parent.appendChild(frag);
구체 적 인 성능 테스트 는 관심 있 는 것 은 모든 코드 를 한 번 씩 뛰 어 볼 수 있다.innerHTML
긴 문자열 을 대응 하 는 DOM 노드 로 변환 합 니 다.일반적으로 먼저 생각 나 는 것 은 innerHTML 입 니 다.대개 프로 세 스 는 div 노드 를 만 든 다음 div.innerHTML=str 입 니 다.필요 에 따라 div 의 children 을 꺼 내 서 놓 을 곳 에 두 고 div 자 체 를 버 리 는 것 입 니 다.
th 노드 를 따로 만 들 고 싶다 면?
위의 절 차 를 시험 해 보 세 요.
var div = document.createElement('div');
div.innerHTML = '<th>xxx</th>';
console.log(div);
실제 출력 은(chrome 아래):
<div>xxx</div>
원 하 는 것 을 얻 지 못 했다.
<div><th>xxx</th></div>
이러한 결 과 는 이해 할 수 있다.왜냐하면 하나의 th 를 div 안에 넣 으 면 아무리 봐 도 틀 리 기 때문에 외곽 의 라벨 을 직접 제거 하고 내용 을 div 안에 던 지 는 것 도 상당히 스마트 하 다.그러나 견 딜 수 없다.때로는 th 노드 를 가 져 와 야 한다.
사실 하기 도 쉬 워,다 쓰 면 되 잖 아.
var node = document.createElement('div');
node.innerHTML = '<table><tbody><tr><th>xxx</th></tr></tbody></table>';
// th
var depth = 3;
while(depth--) {
node = node.lastChild;
}
console.log(node.firstChild);
결과 가 바로 원 하 는 것 임 을 알 수 있다.fragment.js
//
var map = {
legend : [1, '<fieldset>', '</fieldset>'],
tr : [2, '<table><tbody>', '</tbody></table>'],
col : [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
_default : [0, '', '']
};
map.td = map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>'];
map.option = map.optgroup = [1, '<select multiple="multiple">', '</select>'];
map.thead = map.tbody = map.colgroup = map.caption = map.tfoot = [1, '<table>', '</table>']
map.text = map.circle = map.ellipse = map.line = map.path = map.polygon = map.polyline = map.rect = [1, '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">','</svg>'];
var TAG_RE = /<([\w:]+)/;
module.exports = function(templateString) {
var frag = document.createDocumentFragment(),
m = TAG_RE.exec(templateString);
//
if(!m) {
frag.appendChild(document.createTextNode(templateString);
return frag;
}
var tag = m[1],
wrap = map[tag] || map._default,
depth = wrap[0],
prefix = wrap[1],
suffix = wrap[2],
node = document.createElement('div');
//
node.innerHTML = prefix + templateString.trim() + suffix;
// ,
while(depth--) node = node.lastChild;
//
if(node.firstChild === node.lastChild) {
frag.appendChild(node.firstChild);
return frag;
}
// , frag
var child;
while(child = node.firstChild) {
frag.appendChild(child);
}
return frag;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vue Render 함수로 DOM 노드 코드 인스턴스 만들기render에서createElement 함수를 사용하여 DOM 노드를 만드는 것은 직관적이지 않지만 일부 독립 구성 요소의 디자인에서 특수한 수요를 충족시킬 수 있습니다.간단한 렌더링 예는 다음과 같습니다. 또한 v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.