在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. 项目实训 day15-16

    第一天我与灿哲沟通,我弄明白了真正的网络结构且如何运行的,自己记了下网络草图,开始初步用PlotNN绘制 第二天我发现pycore库表达能力不够,于是参考其他用tex写的例子,写了几个方法,最终能生成 ...

  2. Java自增自减运算符

    3.1自增自减运算符 注意事项: ++和--既可以放在变量的后边,也可以放在变量的前边 单独实用的时候,++和--无论是放在变量的前边还是后边,结果是一样的 参与操作的时候,如果放在变量的后边,先拿变 ...

  3. #科技 #资讯 #生活 微信测试更多图片打开方式,神州圆满发射,英伟达或停产性价比神卡,SAMSUNG新一代显存带宽容量双翻倍,这就是今天的其它大新闻

    今天是2022年12月01日 十一月初八 现在是中午12:10 下面是今天的其他大新闻 #NEWS 1 # 微信测试用不同小程序打开图片:快捷调用小程序打开图片.视频.文件 ( 新浪科技 ) 据悉,微 ...

  4. Mybatis-plus的自定义分页搭配sql Server数据库使用

    原文出处:mybatisplus查询分页并且排序报错解决方法,适用于自定义sql和sqlserver_十七梦的博客-CSDN博客 一开始使用过的是官方文档来写分页,结果出现了如果不在最后添加ORDER ...

  5. openfire开源IM服务器知识分享+社交app实战

    一.      概述 Openfire最主要的功能是实现XMPP服务器,简单来说,openfire为我们提供一个固定的地址,我们只需要向openfire服务器发送标准的XMPP信息(即XML文件流), ...

  6. centos6放行防火墙8080端口操作

    1. 进入防火墙文件: [ vi /etc/sysconfig/iptables ] 2. 放行8080端口: [ -A RH-Firewall-1-INPUT -m state --state NE ...

  7. K8S的基础概念

    一.Kubernetes介绍 1.什么是Kubernetes? Kubernetes(通常称为K8s,K8s是将8个字母"ubernete"替换为"8"的缩写) ...

  8. 【内存管理】ION内存管理器(carveout heap预留内存)

    什么是carveout heap carveout heap从代码中给的解释来看,是reserved预留的物理内存来实现的,这些内存buddy系统是没办法看到和管理到的 carveout heap中的 ...

  9. Expression及Equal Demo

    代码参考1: using System; using System.Linq.Expressions; namespace ExpressionDemo { class People { public ...

  10. pkuseg

    git-url: https://github.com/lancopku/PKUSeg-python pkuseg:一个多领域中文分词工具包 pkuseg简单易用,支持细分领域分词,有效提升了分词准确 ...