React入门系列(三)

当我们把虚拟Dom构建成功之后,我们就需要对新旧Dom进行对比,找出其中真正发生变化的部分
在某一时间节点调用 React 的 render()方法,会创建一棵由 React 元素组成的树。在下一次 state 或 props 更新时,相同的 render()方法会返回一棵不同的树。React 需要基于这两棵树之间的差别来判断如何有效率的更新 UI
以保证当前 UI 与最新的树保持同步

Diff算法
当对比两颗树的时候,React会首先比较两颗树的根节点,不同类型的根节点元素会有不同的形态
1. 当根节点为不同类型的元素时:
如果树的根节点为不同类型的元素时,React会拆掉整个旧的树,并且重新构造一个新的树,在旧的Dom树被销毁的时候, 组件实例调用componentWillMount钩子和componentDidMount钩子, 如从<a>到<img>,从<div>到<from>,<Article>到<Commit>都会导致重新创建。并且state会被销毁
2.当根节点为相同类型的元素时:
当比较两个相同类型的Dom元素,React会查看它们两个的属性,React仅仅更新被改变的属性。当处理完根DOM节点之后,React又会递归的比较它们的子元素
3.如果是相同类型的组件元素时:
当组件发生改变的时候,其组件实例并不会随之改变,组件的state还是存在的,state在跨越不同的渲染时保持一致,
React更新下面组件实例的props,下面的组件实例调用componentWillReceiveProps钩子和componentWillUpdate钩子。接下来调用render方法并且diff算法在之前的结果和新的结果上递归
对子节点进行递归
在默认条件下,当递归 DOM 节点的子元素时,React 会同时遍历两个子元素的列表;当产生差异时,生成一个 mutation

<ul>
 <li>first</li>
 <li>second</li>
</ul>

<ul>
 <li>first</li>
 <li>second</li>
 <li>third</li>
</ul>

React会捕获到两个<li>first</li>,两个<li>second</li>,然后将<li>third</li>插入。如果在列表中最开始插入了一个元素,那么对性能影响非常大,

<ul>
  <li>Duke</li>
  <li>Villanova</li>
</ul>

<ul>
  <li>Connecticut</li>
  <li>Duke</li>
  <li>Villanova</li>
</ul>

这种情况React会改变每一个子元素。可以通过给元素设置key来解决这个问题,当子元素拥有 key 时,React 使用 key 来匹配原有树上的子元素以及最新树上的子元素

<ul>
  <li key='1'>Duke</li>
  <li key='2'>Villanova</li>
</ul>

<ul>
  <li key='3'>Connecticut</li>
  <li key='1'>Duke</li>
  <li key='2'>Villanova</li>
</ul>

现在 React 知道只有带着 ‘3’key 的元素是新元素,带着 ‘1’ 以及 ‘2’ key 的元素仅仅移动了,你可以新增一个 ID 字段到你的模型中,或者利用一部分内容作为哈希值来生成一个 key。这个 key 不需要全局唯一,但在列表中需要保持唯一

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React一个用于构建用户界面的 JavaScript 库。它被 Facebook 开发,用于构建 Facebook 和 Instagram 等应用程序的用户界面。React 通过组件化的方式构建用户界面,使得代码更易于维护和复用。下面是一个简单的 React 入门指南: 1. 安装 React React 可以通过 NPM 安装,可以在命令行执行以下命令来安装 React: ``` npm install react react-dom ``` 2. 创建 React 组件 在 React 一个组件就是一个 JavaScript 类。下面是一个简单的组件示例: ```javascript import React from 'react'; class HelloWorld extends React.Component { render() { return <div>Hello World!</div>; } } export default HelloWorld; ``` 这个组件只是简单地渲染一个 `Hello World!` 的文本。 3. 渲染组件 要在页面渲染组件,需要使用 `ReactDOM.render()` 方法。下面是一个简单的示例: ```javascript import React from 'react'; import ReactDOM from 'react-dom'; import HelloWorld from './HelloWorld'; ReactDOM.render( <HelloWorld />, document.getElementById('root') ); ``` 这个示例,我们首先导入了 `ReactDOM` 和 `HelloWorld` 组件,然后使用 `ReactDOM.render()` 方法将 `HelloWorld` 组件渲染到页面上。在这个示例,我们将组件渲染到了一个 ID 为 `root` 的元素。 这只是 React入门React 还有很多其他的概念和功能,比如 JSX、状态、生命周期等等。如果您想深入了解 React,可以查看 React 官方文档,里面有很多有用的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值