React-diff算法和React-其它内容-StrictMode.md

简介: React-diff算法和React-其它内容-StrictMode.md

React 渲染流程


  • 执行 render 方法
<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'
        }
     ]
    }
 ]
}
  • 根据虚拟 DOM 树在界面上生成真实 DOM




React 更新流程


  • props/state 发生改变
  • render 方法重新执行
  • JSX 转换成 createElement
  • 利用 createElement 重新生成新的虚拟 DOM 树
  • 新旧虚拟 DOM 通过 diff 算法 进行比较
  • 每发现一个不同就生成一个 mutation
  • 根据 mutation 更新真实 DOM




React-Diff 算法


  • 只会比较同层元素
  • 只会比较 同位置 元素(默认)

在比较过程中:

  • 同类型元素做修改
  • 不同类型元素重新创建

官方文档:https://zh-hans.reactjs.org/docs/reconciliation.html#the-diffing-algorithm



React-其它内容-StrictMode


StrictMode 概述

  • 作用: 开启 严格模式, 检查后代组件中是否存在潜在问题

注意点:

  • 和 Fragment 一样, 不会渲染出任何 UI 元素
  • 仅在 开发模式 下有效




StrictMode 检查什么


  • 检查过时或废弃的属性 / 方法 / ...

检查意外的副作用:

  • 检查被包裹的组件当中写的一些逻辑代码会被调用多次时,是否会产生一些副作用

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 会被调用两次



官方文档



最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
5月前
|
算法 前端开发 JavaScript
React的diff算法原理
React的diff算法原理
98 0
|
1月前
|
JavaScript 前端开发 算法
React技术栈-虚拟DOM和DOM diff算法
这篇文章介绍了React技术栈中的虚拟DOM和DOM diff算法,并通过一个实际案例展示了如何使用React组件和状态管理来实现动态更新UI。
34 2
|
2月前
|
JavaScript 前端开发 算法
react中虚拟dom和diff算法
在React中,虚拟DOM(Virtual DOM)和Diff算法是两个核心概念,它们共同工作以提高应用的性能和效率。
31 4
|
9天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
15 2
|
2月前
|
前端开发 算法 JavaScript
React原理之Diff算法
【8月更文挑战第24天】
|
4月前
|
JavaScript 算法 前端开发
vue和react的diff算法的区别
vue和react的diff算法的区别
126 3
|
5月前
|
JavaScript 前端开发 算法
React中的DOM diff算法是如何工作的
React的DOM diff算法通过对比新旧虚拟DOM树找到最小更新策略,提高组件更新效率。它生成并比较虚拟DOM,按类型、属性和&quot;key&quot;逐节点检查。不同类型节点直接替换,属性不同则更新属性,相同则递归比较子节点。确定DOM操作后批量执行,减少对真实DOM的访问,优化性能。然而,在复杂场景下可能有性能问题,可借助shouldComponentUpdate、memo或PureComponent等进行优化。
|
前端开发 JavaScript 算法
解密二叉树:探索概念、类型与常见算法的奥秘(顺带说一下React中的reconcile)
二叉树作为程序的一种数据结构,应用广泛,比如React中的reconcile过程,Fiber树的调和过程。确实,在React中,Fiber树是通过child和sibling连接子节点和兄弟节点的方式来表示的,这与普通的二叉树有所不同。 在React中,reconcile过程是将虚拟DOM转化为实际DOM的过程。通过比较新旧两棵树的差异,React可以高效地更新实际DOM,而不是每次都完全重新渲染整个DOM树。这个过程中会涉及到对Fiber树的遍历和调整,确保更新只发生在需要更新的部分。 Fiber树作为一种数据结构,可以帮助React跟踪组件的状态和变化,以及进行调度和渲染。它使用链表的形
46 1
解密二叉树:探索概念、类型与常见算法的奥秘(顺带说一下React中的reconcile)
|
JavaScript 算法 前端开发
react的diffing算法
react的diffing算法
53 0
|
2月前
|
前端开发 JavaScript UED
React 基础与实践 | 青训营笔记
React 基础与实践 | 青训营笔记
44 0
下一篇
无影云桌面