在react中当你的状态发生改变时,并不是所有组件的内容销毁再重建,能复用的就复用

react 组件其实 就是按照层级划分的

找到两棵任意的树之间最小的修改是一个复杂度为 O(n^3) 的问题.

你可以想象, 我们的例子里这不是容易处理的. React 用了一种简单但是强大的技巧, 达到了接近 O(n) 的复杂度. --- diff 算法 (以前是电脑的键盘坏了换一个电脑,现在是键盘坏了直接换键盘) React 仅仅是尝试把树按照层级分解. 这彻底简化了复杂度, 而且也不会失去很多, 因为 Web 应用很少有 component 移动到树的另一个层级去. 它们大部分只是在相邻的子节点之间移动.

例1:(按层级划分)

import React, { Component } from 'react'
import MyCom from './MyCom';
export default class extends Component {
constructor (props) {
super(props);
this.state = {
first: true
}
}
changeHandler (event) {
console.log(event.currentTarget.checked)
this.setState({
first: event.currentTarget.checked
})
}
render () {
if (this.state.first) {
return (
<div>
<h1>diff算法</h1>
<input type="checkbox" checked={ this.state.first } onChange = { this.changeHandler.bind(this) }/>
<p>为真我就显示</p>
</div>
)
} else {
return (
<div>
<h1>diff算法</h1>
<input type="checkbox" onChange = { this.changeHandler.bind(this) }/>
<p>为假我就显示</p>
</div>
)
} }
}

例2(利用列表的key)

import React, { Component } from 'react'
import MyCom from './MyCom';
export default class extends Component {
constructor (props) {
super(props);
this.state = {
list: ['aa', 'bb', 'cc', 'dd']
}
}
shouldComponentUpdate () {
// return false
return true
}
addItemnext () {
let arr = this.state.list
arr.push('eee')
this.setState({
list: arr
})
}
addItemprev () {
let arr = this.state.list
arr.unshift('ff')
this.setState({
list: arr
})
}
addItemcenter () { }
render () {
return (
<div>
<button onClick={ this.addItemnext.bind(this) }>后面加</button>
<button onClick={ this.addItemprev.bind(this) }>前面加</button>
<button onClick={ this.addItemcenter.bind(this) }>中间加</button>
<ul>
{ this.state.list.map((item, index) => {
return (<li key={item}>{ item }</li>)
})}
</ul>
</div>
)
}
}

例3

import React, { Component } from 'react'
import MyCom from './MyCom';
export default class extends Component {
constructor (props) {
super(props);
this.state = {
list: ['aa', 'bb', 'cc', 'dd']
}
}
shouldComponentUpdate () {
// return false
return true //要么不写,写的话只可以写true 不然不会更新
}
addItemnext () {
let arr = this.state.list
arr.push('eee')
this.setState({
list: arr
})
}
addItemprev () {
let arr = this.state.list
arr.unshift('ff')
this.setState({
list: arr
})
}
addItemcenter () { }
render () {
return (
<div>
<button onClick={ this.addItemnext.bind(this) }>后面加</button>
<button onClick={ this.addItemprev.bind(this) }>前面加</button>
<button onClick={ this.addItemcenter.bind(this) }>中间加</button>
<ul>
{ this.state.list.map((item, index) => {
return (<li key={item}>{ item }</li>)
})}
</ul>
</div>
)
}
}

react中的虚拟DOM,jsx,diff算法。让代码更高效的更多相关文章

  1. 深入理解react中的虚拟DOM、diff算法

    文章结构: React中的虚拟DOM是什么? 虚拟DOM的简单实现(diff算法) 虚拟DOM的内部工作原理 React中的虚拟DOM与Vue中的虚拟DOM比较 React中的虚拟DOM是什么?   ...

  2. 【React 7/100 】 虚拟DOM和Diff算法

    虚拟DOM和Diff算法 React更新视图的思想是:只要state变化就重新渲染视图 特点:思路非常清晰 问题:组件中只有一个DOM元素需要更新时,也得把整个组件的内容重新渲染吗? 不是这样的 理想 ...

  3. 谈谈Vue/React中的虚拟DOM(vDOM)与Key值

    谈谈Vue/React中的虚拟DOM(vDOM)与Key值 一.DocumentFragment 在了解虚拟DOM前,先来了解DOM的一个对象属性--DocumentFragment. 在一次操作中, ...

  4. 虚拟DOM与diff算法

    虚拟DOM与diff算法 虚拟DOM 在DOM操作中哪怕我们的数据,发生了一丢丢的变化,也会被强制重建整预DOM树.这么做,涉及到很多元素的重绘和重排,导致性能浪费严重 只要实现按需更新页面上的元素即 ...

  5. vue虚拟dom和diff算法

    vue的虚拟dom和diff算法 1.虚拟dom 虚拟dom,我的理解就是通过js对象的方式来具体化每一个节点,把dom树上面的每个节点都变为对象里的一个元素,元素的子元素变为子节点,节点上面的cla ...

  6. 简谈react中的虚拟DOM

    相信你在看到此篇前也翻阅大量的对DOM的文章讲解和介绍 react中的虚拟DOM 此篇我尽量说人话(大白话),不然想必你在看到别的大神的文章早就懂了. 不说废话了,上干货. 1.首先简单对Html中的 ...

  7. 虚拟dom和diff算法

    https://github.com/livoras/blog/issues/13 这里简单记录一些要点和理解: 一个dom元素中有许多属性,操作dom是很耗资源的,而操作自定义的js对象是很高效.所 ...

  8. React中的虚拟DOM

    当组件当state和props发生变化当时候,组件当render函数就会重新执行,组件就会被重新渲染,react中实现这种重新渲染,他的性能是非常高的,因为他引入了一个虚拟Dom的概念,那么什么是虚拟 ...

  9. react中虚拟dom的diff算法

    .state 数据 .jsx模板 .生成虚拟dom(虚拟DOM就是一个js对象,用它来描述真实DOM) ['div', {id:'abc'}, ['span', {}, 'hello world']] ...

  10. 【React自制全家桶】二、分析React的虚拟DOM和Diff算法

    一.React如何更新DOM内容: 1.  获取state 数据 2.  获取JSX模版 3.  通过数据 +模版结合,生成真实的DOM, 来显示,以下行代码为例(简称代码1) <div id= ...

随机推荐

  1. c++学习8 动态空间申请

    一 动态分配内存的概述 在数组一幕中,介绍过数组的长度是事先预定好的,在整个程序中固定不变.但是在实际的编程过程中,往往会发生这种情况:我们并不清楚到底需要多少数目的空间,而且无法事先预定,所以对了应 ...

  2. Django框架搭建web项目(一)

    建议查看官方文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial01/ 1.本地安装python环境(略) 2.本地安装Django ...

  3. Educational Codeforces Round 3 个人总结A-D

    Educational Codeforces Round 3 A. USB Flash Drives 降序排序后,贪心,甚至不会爆longlong void solve() { int n,m; ci ...

  4. Jmeter-接口测试(一)

    一.接口测试分类 内部接口 外部接口--被测系统调用外部     --系统对外部提供的接口 接口测试重点:接口参数传递的正确性.接口功能的正确性.输出结果正确性.各种异常容错处理.权限控制.分页.调用 ...

  5. js使用sort将JSON数据进行排序

    在把数据通过Echarts展示成统计图模式时,柱状统计图需要将数据进行从大到小来排序! 下面为所需要的数据: 1 { 2 mapData: [ 3 {name: '北京',value: '555'}, ...

  6. C# POST multipart/form-data 方式提交数据

    一.提交方法 /// <summary> /// MultipartFormData Post方式提交 /// </summary> /// <param name=&q ...

  7. ASP.NET Core 读取配置文件信息

    一:读取配置文件 先来看一下appsettings.json文件的内容,如下图: { "ConnectionStrings": { "ServerConnection&q ...

  8. MySQL查询和事务

    数据库关联查询 内连接查询(inner join) SELECT * FROM tb1 INNER JOIN tb2 ON 条件 左表查询(左关联查询)(left join) 查询两个表共有的数据,和 ...

  9. js数组常用的方法

    var arr=['hello','前端','world']; 1. arr.join(分隔符):将数组中的值拼接成一个字符串,返回这个字符串,默认分隔符"," arr.join( ...

  10. 【组会】2023_1_6 4d mmwave

    A NEW AUTOMOTIVE RADAR 4D POINT CLOUDS DETECTOR BY USING DEEP LEARNING ICASSP 2021 - 2021 IEEE Inter ...