Element 总结篇

661 阅读2分钟

总结

到了这里我们来总结一下关于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为不同类型的组件采用不同的方式来实例化,并且为实例加入不同的方法来保证组件在挂载,更新,卸载等方面的使用。 具体的组件的挂载 请参考文章 挂载部分