Comments (3)
* 元素: 元素虚拟DOM产生updater, 放入列队
* 插入其孩子的所有DOM, 收集�孩子中的组件updater, resolve
* 组件: 元素虚拟DOM产生instance与updater, 执行 willMount,
* 立即调用render,目的是能让子级组件立即 willMount
* <App /> ==> <p ref={refFn}>{this.state.xxx}</p>
* container
*
*
* 元素的render,用于添加子节点,收集它们的updater
* 元素的resolve, 用于设置属性与可控属性,执行它们的ref
*
* 组件的render, 用于执行它们的render, diffChildren
* 元素的resolve, 执行生命周期钩子与ref与处理异常
*
* <App><A /><A /><span>xxx</span></App>
*
* children.forEach(function(){ el.render() })
* children.
*
* VNode.prototype.render = function(p, queue){
* var el = this
* if(el.vtype < 1){
* el.stateNode = toDOM(el, p)
* }else if(el.vtype === 1){
* el.stateNode = toDOM(el, p)
* for(var i in children){
* var a = children[i]
* a.render(el, queue)
* }
* queue.push(el)
* } else {
* var c = el.stateNode = toComponent(el, p, queue)
* el.render() //组件
* queue.push(el.updater)
* }
* }
* Vnode.prototype.append = function(parentNode){
* var p = this.stateNode, children = this.children
* if(this.vtype === 1){
* for(var i in children){
* var el = children[i]
* if(el.vtype < 1){
* p.appendChild(el.stateNode)
*
* }else if(el.vtype === 1){
*
* el.append(p)
* el.resolve()
* }else if(el.vtype > 1){
* el.append(p)
* el.resolve()
* }
* }
* }
* }
*
from anu.
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]);
}
}
}
},
from anu.
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;
}
};
from anu.
Related Issues (20)
- input输入汉字不触发onChange事件 HOT 2
- 项目是否考虑升级为ts HOT 1
- 二次元魔法师希望你在那边过的开心
- 1 HOT 1
- 致敬,大佬走好 HOT 9
- RIP
- RIP HOT 5
- 致敬
- 致敬,默哀 HOT 3
- 一路走好
- 走好 HOT 3
- RIP
- 官方Q群加不进去
- 走好 大佬
- RIP ,走好大佬
- 大佬 走好
- 大佬 走好!
- 还有人维护这个库吗?
- IE8别用这个库,有内存泄漏问题,我因为自己的机器是ie11写完了才发现,特此提醒你们,并且以后也不会有人维护了 HOT 1
- 大佬走好
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from anu.