Mini-react 思路

149 阅读2分钟

react 是什么

先来聊聊,这是个什么

案例1

  1. 页面显示一个按钮,点击后页面count变量加1
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <div id="root">
            <div id="content" onclick="changeText()">Click Me, Count: 0</div>
        </div>
    </body>
    <style>
        #content{
            font-size:22px;
            border: 1px solid gray;
            cursor: pointer;
            padding: 6px 10px;
            display: inline-block;
            border-radius: 10px;
        }
    </style>
    <script lang="javascript">
        let count = 0
        function changeText(){
            count ++
            document.getElementById('content').innerText = "Click Me, Count: " + count
        }
    </script>
</html>

  <script type="text/babel">
      function MyFunctionComponent() {
        let [count, setCount] = React.useState(0)
        return <div id="content" onClick={()=>setCount(++count)}>Click Me, Count: {count}</div>
      }

      const container = document.getElementById('root');
      const root = ReactDOM.createRoot(container);
      root.render(<MyFunctionComponent />);

    </script>

所以初步定义 react就是一个通过数据变化,操作dom 的工具 数据驱动视图(数据的变化改变视图)

虚拟dom 与真实DOm

dom是什么 一种html文档接口--表示并改变文档(理解较浅) 如果直接操作dom 你每次操作dom遍历里面的属性,会发现相当多,并且本身js是单线程语言,直接操作dom会触发回流操作,因此react想最大限度避免无效的渲染。 image.png 于是虚拟dom就是为了能最大限度复用不变的属性,只进行差异化渲染更新。

image.png

createElement

而文本节点是没有 type、children、props 的。 将jsx 转化VDOm 其实就是一个包含类型,及props 的一个嵌套层级的对象 但是其实VDOM 本身是不具备优先级等其他信息,也并不具备相邻节点的引用,。所以不能实现异步可中断的更新

createDom

其实就是为了能把fiber 转换为dom :并更新对应属性,就是元素标签上的属性

fiber

vdom怎么转化为fiber 通过reconcile

image.png

但是一次性,肯定完成不了 所以需要等待浏览器空闲再去执行。依赖requestidealcallback

reconcile

首次渲染会生成fiber链表 更新后,再次生成,并进行diff ,打上标签

commit

再次遍历链表,执行里面的effect函数,对dom进行增删改查

持续更新中

源码地址

github.com/Ariesove/mi…