react中的虚拟DOM,jsx,diff算法。让代码更高效
在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算法。让代码更高效的更多相关文章
- 深入理解react中的虚拟DOM、diff算法
文章结构: React中的虚拟DOM是什么? 虚拟DOM的简单实现(diff算法) 虚拟DOM的内部工作原理 React中的虚拟DOM与Vue中的虚拟DOM比较 React中的虚拟DOM是什么? ...
- 【React 7/100 】 虚拟DOM和Diff算法
虚拟DOM和Diff算法 React更新视图的思想是:只要state变化就重新渲染视图 特点:思路非常清晰 问题:组件中只有一个DOM元素需要更新时,也得把整个组件的内容重新渲染吗? 不是这样的 理想 ...
- 谈谈Vue/React中的虚拟DOM(vDOM)与Key值
谈谈Vue/React中的虚拟DOM(vDOM)与Key值 一.DocumentFragment 在了解虚拟DOM前,先来了解DOM的一个对象属性--DocumentFragment. 在一次操作中, ...
- 虚拟DOM与diff算法
虚拟DOM与diff算法 虚拟DOM 在DOM操作中哪怕我们的数据,发生了一丢丢的变化,也会被强制重建整预DOM树.这么做,涉及到很多元素的重绘和重排,导致性能浪费严重 只要实现按需更新页面上的元素即 ...
- vue虚拟dom和diff算法
vue的虚拟dom和diff算法 1.虚拟dom 虚拟dom,我的理解就是通过js对象的方式来具体化每一个节点,把dom树上面的每个节点都变为对象里的一个元素,元素的子元素变为子节点,节点上面的cla ...
- 简谈react中的虚拟DOM
相信你在看到此篇前也翻阅大量的对DOM的文章讲解和介绍 react中的虚拟DOM 此篇我尽量说人话(大白话),不然想必你在看到别的大神的文章早就懂了. 不说废话了,上干货. 1.首先简单对Html中的 ...
- 虚拟dom和diff算法
https://github.com/livoras/blog/issues/13 这里简单记录一些要点和理解: 一个dom元素中有许多属性,操作dom是很耗资源的,而操作自定义的js对象是很高效.所 ...
- React中的虚拟DOM
当组件当state和props发生变化当时候,组件当render函数就会重新执行,组件就会被重新渲染,react中实现这种重新渲染,他的性能是非常高的,因为他引入了一个虚拟Dom的概念,那么什么是虚拟 ...
- react中虚拟dom的diff算法
.state 数据 .jsx模板 .生成虚拟dom(虚拟DOM就是一个js对象,用它来描述真实DOM) ['div', {id:'abc'}, ['span', {}, 'hello world']] ...
- 【React自制全家桶】二、分析React的虚拟DOM和Diff算法
一.React如何更新DOM内容: 1. 获取state 数据 2. 获取JSX模版 3. 通过数据 +模版结合,生成真实的DOM, 来显示,以下行代码为例(简称代码1) <div id= ...
随机推荐
- WPF_MahApps.Metro界面主题使用
一.创建WPF项目: 二.下载MahApps.Metro: 三.修改MainWindow.xaml 1.添加一栏: xmlns:mah="clr-namespace:MahApps.Metr ...
- MySQL 面试题总结
MySQL的面试知识点总结 Q1:MySQL 的逻辑架构了解吗? 第一层是服务器层,主要提供连接处理.授权认证.安全等功能. 第二层实现了 MySQL 核心服务功能,包括查询解析.分析.优化.缓存以及 ...
- nuttx理解
操作系统:为啥要引入操作系统,个人的理解是为了实时性(即及时的响应性). 没有操作系统下多个任务都只能以前后台的方式排队执行,对某个任务的输入不能得到及时的响应:虽然后台有中断,但不能把所有的任务都放 ...
- 消息队列 RocketMQ4.x介绍和新概念讲解
消息队列 RocketMQ4.x介绍和新概念讲解 Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件 RocketMQ4.x特点 支持Broker和Consumer端消 ...
- JMeter参数化(一)--CSV参数化
一.CSV Data Set Config 1.添加配置元件-CSV Data Set Config 其中,分隔符不能是参数化的值中的符号,否则会被截断. 2.调用 3.循环读取文件中数据 假设数据内 ...
- 用appium来操作模拟器
1 import time 2 from appium import webdriver 3 from selenium.webdriver.common.by import By 4 from se ...
- 狂神学习笔记domo6
1.新特性,1000000000可以写成10_0000_0000便于阅读 2.强制类型转换 先强制类型转换再赋值才能正确的结果 public class domo06 { public static ...
- 1007.Django模型基础02
一.常用的查询 常用的查询方法(注:User为app项目): 获取所有的记录: rs = User.objects.all() 获取第一条数据:rs = User.objects.first() 获取 ...
- java学习笔记(四)变量
局部变量,必须声明和初始化值: 实列变量,从属于对象:如果不自行初始化,这个类型的默认值,数值类型,0,0.0 布尔值 默认为false 除了基本类型下,其余的默认值都是null 如 变量类型 ...
- 银行对账单PDF一页拆分多页
一个页拆分多个页,按照流水 String bank = "{\n" + "\t\"bank\" : [\n" + "\t\t{\n ...