react 是什么
先来聊聊,这是个什么
案例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想最大限度避免无效的渲染。
于是虚拟dom就是为了能最大限度复用不变的属性,只进行差异化渲染更新。
createElement
而文本节点是没有 type、children、props 的。 将jsx 转化VDOm 其实就是一个包含类型,及props 的一个嵌套层级的对象 但是其实VDOM 本身是不具备优先级等其他信息,也并不具备相邻节点的引用,。所以不能实现异步可中断的更新
createDom
其实就是为了能把fiber 转换为dom :并更新对应属性,就是元素标签上的属性
fiber
vdom怎么转化为fiber 通过reconcile
但是一次性,肯定完成不了 所以需要等待浏览器空闲再去执行。依赖requestidealcallback
reconcile
首次渲染会生成fiber链表 更新后,再次生成,并进行diff ,打上标签
commit
再次遍历链表,执行里面的effect函数,对dom进行增删改查
持续更新中