function React() {
// 全局的更新栈,对象时组件
var stateStack = [];
// 抽象的Component
function Component(state) {
// 此处笼统的将props和state混为一个概念
this.state = state;
this.setState = function(state){
// setState 并不直接改变组件的state
// 而是记录一次主线程执行中,state请求的变更记录
stateStack.push(this);
}
this.render() {
//更新视图
return virtaulDom;
}
// 组件实例化后,将组件放入更新队列等待react执行更新
stateStack.push(this);
}
// App 使用react技术的应用
function App() {
// 应用中创建一个react的规范的根组件
var rootComponent = Component;
// 挂载并实例化根组件
rootComponent({});
}
// 全局渲染方法 扫描更新队列,执行更新
this.globalRender = function *(){
// 无限循环
while(true){
// 取出第一个更新组件,每次更新都把当前组件加入更新队列
// 当前组件更新,会重置子组件入参,导致子组件更新任务随之加入这个队列,一个队列其实就是一截组件树
var component = stateStack.shift();
if(component){
// 取出当前组件的state记录并合并
var state = component .stateStack.reduce(function(pre, cur){
return {
...pre,
...cur,
};
},{})
if(component.state !== state){
var virtaulDom = component.render(state);
// 与真实DOM比较,选择性更新真实DOM
// TODO 数据存在不同的地方修改真实DOM
}
}
}
// 关键: 此处用于控制执行更新时机,否则就是真正的死循环了
yield;
}
// 自动控制执行更新
this.autoRender = function (result) {
result.next();
var self = this;
// 自动扫描更新队列的间隔设置为1毫秒
setTimeout(function(){self .autoRender(result)}, 1);
}
// 初始化APP:创建APP的根组件
App();
// react开始循环扫描更新队列,执行更新
var result = this.globalRender();
this.autoRender(result );
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。