React-ReactElement解析

更新:   看React请看这篇的更新 http://www.cnblogs.com/sven36/p/6486860.html

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

前言:最近一直在研究React,看了陈屹先生所著的深入React技术栈,以及自己使用了这么长时间。对React应该说有比较深的理解了,正好前阵子也把两本关于前端设计模式的书看完了,总感觉有一种知识错综交汇,纷纷复复在脑海里交缠的感觉,真有不吐不快之感,正好也借这几篇博客融会贯通所学的知识。

          目前手里研究的是React15.3.1这个版本,React版本更新很快,相关API的名字位置等都可能发生改变,不过其ReactElement的生成,渲染,移除等流程是不会改变的,在下希望略尽绵力希望能以管窥豹,笔力,能力所限之处,还望海涵。

           首先,我想先说一说我对前端的看法,因为我之前一直在做.NET后端,刚开始的时候JS就是边搜边用,并没有系统了解前端,直到一年前看了JS高级程序设计,我觉得才算真正认识了JS,后来又陆陆续续看了很多前端的书,在以前的工作中因为前端的很多逻辑都可以在后台实现,前端大部分工作都是渲染数据,操作DOM等;单独JQuery完全可以搞定;

           当然JQuery是一个非常优秀的框架,不过随着前端工程化,规模化的趋势越来越强;而今,以Angular,React,Vue,Node为代表这股前端的浪潮正在扑面而来,身为一个技术人员,能经历这么一次浪潮的起伏是一次很难得的机会

          言归正传:那么回到React本身,React的创新性和优点在哪里呢?我个人认为是其用嵌套的JavaScript对象来表示DOM结构,即Virtual DOM并通过Virtual DOM的渲染过程把DOM操作放到内存里,在这个过程还可以实现DOM diff算法和DOM的生命周期管理;

          ReactElement解析

          先看一下如果按照平常的思路我们操作DOM是如何操作的,基本上就是直接innerHtml赋值,appendChild(node)或者removeChild(node);这样写的话效果很直接,不过也有一些缺点显现出来:代码没有良好的结构,可扩展性,可维护性差;基本上就是一个DOM对象对应一个或多个DOM操作,很难复用函数;那么React是如何解决这些问题的呢?

          就是用嵌套的JavaScript对象来表示DOM,那么这个JavaScript对象是如何表示的我们来调试一下:

           我们先引入下载好的react.js和react-dom这两个文件;我们通常用的JSX语法只是一个语法糖,经过静态编译后就会编译成上图React.createElement的JS调用;这里我们直接调用该方法,看看React是如何运行的;

     

          我们看的ReactElement其实就是一个JavaScript对象,其参数主要为:$$typeof: REACT_ELEMENT_TYPE:这是ReactElement的唯一标识;

 key:用来调和DOM Diff的我们先忽略它;props:我们可以看的我们传入的DOM属性被分析成一个对象,成为ReactElement的一个属性;ref:是可以获取渲染后的DOM的引用,这里我们先忽略;

type:就是传入的标签名,我们看的我们传入的是div(或者是React的包裹函数);_store:是在特殊情况下做一个备份,我们先忽略它;

          单有一个对象可能还不太清晰,那我们再嵌套一个对象看一下;

可以看的,父元素的props对象的一个属性children指向了刚新建的eleChildren元素;我们用对象的形式表示出来就是:

{
      $$typeof: Symbol(react.element),//ReactElement的唯一标识
      _owner: null,
      key: undefined,//唯一标识
      props: {//属性
              children: {
                    $$typeof: Symbol(react.element),
                    _owner: null,
                    key: undefined,
                    props: {
                          children: "look~",
                          id: "reactChild"
                    },
                    ref: undefined,
                    type: "p"
              },
              id: "text",
              onclick:"hello"//指向hello方法的指针
      },
      ref: undefined,//对DOM的引用
      type: "div"//标签类型
      }

      这样的话ReactElement的结构就很清楚了,React正是通过这种对DOM的抽象,再根据不同的ReactElement生产不同的组件Component,然后递归渲染;

      代码我已上传至GitHub大家可以直接在本地调试:https://github.com/sven36/React-VirtualDom

      此外在ReactDOM.render()处打断点跟进去就可以慢慢分析其如何完成事件绑定,还有其生命周期管理是如何操作的

这些坑先挖着,以后慢慢填吧~

原文地址:https://www.cnblogs.com/sven36/p/6267105.html