总结
到了这里我们来总结一下关于Element。
一:Element是自定义组件的render方法返回的内容的js对象表现形式,这个js 对象有一些属性,其中比较重要的是 type属性。
二:根据 Element极其type的不同,可以分为几类。
1 Element 的类型为 null 或者是false。
2 Element 的类型为Object,且type为function
3 Element 的类型为Object,且 type为string
4 Element 本身为string
三: 不同的Element选择不同的模块来实例化挂载实例。 四:挂载实例都会带有一些方法来辅助该类型组件的挂载与卸载更新。
挂载实例分类
一: Element 的类型为Object,且type为function的时候选择 ReactCompositeComponentWrapper来实例化挂载实例。 ReactCompositeComponentWrapper 实例化的挂载实例一般需要再次对其进行实例化,最终实例化为 ReactDOMComponent 类型的实例。
二:Element 的类型为 null 或者是false。 则选择 ReactEmptyComponent 模块来实例化。
三: Element 本身为string 来选择ReactDOMTextComponent来实例化挂载实例。
四: Element 的类型为Object,且 type为string 选择 ReactDOMComponent 来实例化,但是,这个不会直接使用而是,自定义的组件在ReactCompositeComponentWrapper 实例化的时候,调用自身的 mountComponent方法的时候会递归调用ReactDOMComponent来实例化其内部的内容。关于这一块请参考文章挂载核心
特殊的 Element
React会为最外层的HTML标签生成一个Element,这个标签就是下边这个
<div id ="app"></div>
ReactMount 模块的下边方法,就初始化了一个最外层的一个Element。
new ReactElement(TopLevelWrapper, null, null, null, null, null, nextElement);
这个方法的触发时机是 我们调用下边的这个方法的时候。
ReactDOM.render(<App />, document.getElementById("app"));
TopLevelWrapper的样子如下所示
var TopLevelWrapper = function () {};
TopLevelWrapper.prototype.isReactComponent = {};
if (process.env.NODE_ENV !== 'production') {
TopLevelWrapper.displayName = 'TopLevelWrapper';
}
TopLevelWrapper.prototype.render = function () {
// this.props is actually a ReactElement
return this.props;
};
如此便生成了一个特殊的Element,整体的样子如此如下:
最后
这一段,我们只是描述了一下React是怎么处理组件的,React为不同类型的组件采用不同的方式来实例化,并且为实例加入不同的方法来保证组件在挂载,更新,卸载等方面的使用。 具体的组件的挂载 请参考文章 挂载部分