자신의 가상 DOM 쓰기 (3)
이제 가상 DOM 하 나 를 진실 한 DOM 으로 만 들 수 있 으 니 두 개의 가상 DOM 을 어떻게 비교 하 는 지 생각해 볼 때 가 되 었 다.우 리 는 두 개의 가상 DOM 트 리 를 비교 한 다음 에 수요 에 따라 신 구 를 실제 DOM 에 반영 하 는 알고리즘 이 필요 하 다.
changed
함 수 를 써 서 두 node 가 같은 지 (변화 가 있 는 지) 를 검사 하고 변화 가 있 으 면 true 로 돌아 가 며 변화 가 없 으 면 false 로 돌아 가 는 것 이다.function changed(node1,node2){
return typeof node1 !== typeof node2 || typeof node1 ==='string' && node1!==node2 || node1.type !==node2.type;
}
const a = (
- item 1
- item 2
);
const b =(
- item 1
)
이 두 가상 DOM 이
changed()
방법 으로 판단 한다 면 분명 다 를 것 이다. 그렇다면 현재 의 목 표 는 어디 가 다른 지 찾 는 것 이다.위의 두 가상 DOM 을 대조 하여 먼저 두뇌 의 사 고 를 정리 합 니 다.
a. 먼저 얼 노드 를 비교 하고 두 노드 가 같다.b. children 요 소 를 비교 하면 첫 번 째 children 요 소 는 li 요소 c 입 니 다. 이 li 요 소 를 비교 하면 li 요소 의 요소 유형 이 같 습 니 다.e. 얼 의 children 두 번 째 요 소 를 비교 한 결과 a 는 li 이 고 b 는 button 이 며 다른 것 을 발견 했다.
이것 은 두뇌 의 사고 이다. 만약 에 이 절 차 를 프로그램 코드 로 바 꾸 면 분명 하고 재 귀적 인 사상 이 필요 하 다.그러나 다른 것 을 찾 는 것 은 첫 번 째 단계 이 고, 두 번 째 단 계 는 다른 것 을 찾 은 후에 다른 점 을 상응하는 변 화 를 주 는 것 이다.
그래서 저 는
updateElement()
방법 을 썼 습 니 다. 이 방법 은 두 개의 가상 DOM 을 가지 고 처리 할 것 입 니 다. 먼저 두 개의 가상 DOM 이 다른 곳 을 찾 은 다음 에 위 치 를 정 하고 실제 DOM 의 생 성과 교 체 를 할 것 입 니 다.function updateElement($parent,newNode,oldNode,index=0){
if(changed(newNode,oldNode)){// node ,
$parent.replaceChild(createElement(newNode),$parent.childNodes[index]);
}else if(newNode.type){// type , , textNode,
for(let i=0;i
위의 이 코드 는 논리 적 으로 이해 하기 어렵 습 니 다. 가능 하 다 면 여러분 스스로 깊이 생각해 보 세 요. 이 코드 는 제 가 한 시간 넘 게 써 서 쓴 것 입 니 다.
지금 은 순조롭게 운행 할 수 있 습 니 다. 비록 결함 이 있 지만 가장 간단 한 가상 DOM 원 리 는 조금 알 수 있 습 니 다. 제 온라인 코드 를 보 세 요.
총결산
이 절차 에서 가장 배 울 점 은 가상 DOM 의 실질 과 전체적인 사고 입 니 다. 여러분 들 이 이런 느낌 을 받 을 수 있 을 지 모 르 겠 지만 사실은 가상 DOM 은 전형 적 인 데이터 구조 + 알고리즘 의 실현 입 니 다.저도 최근 에 깊 은 감명 을 받 았 습 니 다. 사실은 현재 의 전단 구조 로 볼 때 성숙 한 데이터 구조 + 알고리즘 의 실현 이 고 소프트웨어 공학 도 추가 되 었 습 니 다.이것 도 제 가 최근 에 겪 은 병목 이기 때문에 데이터 구조 와 알고리즘 을 열심히 배 울 생각 입 니 다.토론 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.