-
Notifications
You must be signed in to change notification settings - Fork 319
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
元素虚拟DOM也有updater #79
Labels
Comments
|
batchUpdate(lastChildren, nextChildren, debug) {//子节点主动让父节点来更新其孩子 Fragment []
var vnode = this.vnode;
var parentNode = vnode.stateNode,
newLength = nextChildren.length,
oldLength = lastChildren.length,
unique = createUnique();
var fullNodes = toArray(parentNode.childNodes);
var startIndex = fullNodes.indexOf(lastChildren[0]);
var insertPoint = fullNodes[startIndex] || null;
for (let i = 0; i < newLength; i++) {//Set
let child = nextChildren[i];
let last = lastChildren[i];
if (last === child) {
//如果相同
} else if (last && !unique.has(last)) {
parentNode.replaceChild(child, last); //如果这个位置有DOM,并且它不在新的nextChildren之中
} else if (insertPoint) {
parentNode.insertBefore(child, insertPoint.nextSibling);
} else {
parentNode.appendChild(child);
}
insertPoint = child;
unique.add(child);
}
if (newLength < oldLength) {
for (let i = newLength; i < oldLength; i++) {
if (!unique.has(lastChildren[i])) {
removeElement(lastChildren[i]);
}
}
}
}, |
export function collectAndResolve(children, resolve, debug) {
var ret = [];
for (var i in children) {
var child = children[i];
var inner = child.stateNode;
if (child._disposed) {
continue;
}
if (child.vtype < 2) {
// console.log(inner, debug);
ret.push(inner);
} else {
var updater = inner.updater;
if (updater.cache) {
ret.push.apply(ret, updater.cache);
} else {
if (child.child) {
var args = collectAndResolve(updater.children, resolve, debug);
updater.cache = args;
ret.push.apply(ret, args);
}
}
if (resolve) {
updater.addJob("resolve");
resolve.push(updater); //先执行内围的,再执行外围的
}
}
}
return ret;
}
export function createUnique() {
return typeof Set === "function" ? new Set() : new InnerSet();
}
function InnerSet() {
this.elems = [];
}
InnerSet.prototype = {
add: function(el) {
this.elems.push(el);
},
has: function(el) {
return this.elems.indexOf(el) !== -1;
}
};
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
组件虚拟DOM会产生 CompositeUpdater
元素虚拟DOM会产生 DOMUpdater
它们至少用于控制ref的执行
The text was updated successfully, but these errors were encountered: