<div>
<div><p>我是段落</p></div>
<div><span>我是span</span></div>
</div>
JSX
转换成 createElement
React.createElement("div", null,
React.createElement("div", null,
React.createElement("p", null, "我是段落")),
React.createElement("div", null,
React.createElement("span", null, "我是span"))
);
createElement
创建虚拟 DOM, 得到虚拟 DOM 树{
targetName: 'div',
children:[
{
targetName: 'div',
children:[
{
targetName: 'p'
}
]
},
{
targetName: 'div',
children:[
{
targetName: 'span'
}
]
}
]
}
props/state
发生改变JSX
转换成 createElement
createElement
重新生成新的虚拟 DOM 树diff 算法
进行比较mutation
mutation
更新真实 DOM
同位置
元素(默认)在比较过程中:
官方文档:https://zh-hans.reactjs.org/docs/reconciliation.html#the-diffing-algorithm
严格模式
, 检查后代组件中是否存在潜在问题注意点:
开发模式
下有效检查意外的副作用:
index.js:
import React from "react";
import {createRoot} from "react-dom/client";
import App from "./App";
// 为提供的创建一个 React 根container并返回根。
const root = createRoot(document.getElementById("root"));
// 根可用于将 React 元素渲染到 DOM 中
root.render(
<React.StrictMode>
<App/>
</React.StrictMode>
);
app.js:
import React from 'react';
class App extends React.PureComponent {
constructor(props) {
super(props);
console.log('constructor');
}
render() {
return (
<div id={'app'}>
<p ref={'myRef'}>我是段落</p>
<button onClick={() => {
this.btnClick()
}}>按钮
</button>
</div>
)
}
btnClick() {
console.log(this.refs.myRef);
}
}
export default App;
constructor
会被调用两次本期结束咱们下次再见👋~
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。