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= ...
随机推荐
- curl下载远程图片到服务器
<?php //curl下载远程图片到服务器 方法 function download($url, $path = 'images/'){ $ch = curl_init(); $names = ...
- 面向对象3(Java)
多态 基本介绍 即同一方法可以根据发送对象的不同而采用多种不同的行为方式 一个对象的实际类型是确定的,但是可以指向对象的引用类型可以很多 多态存在的条件:a.有继承关系:b.子类重写父类方法:c.父类 ...
- 字典:求和计数(return知识巩固)
野餐用品计数 之前写过一段,字符在字符串中出现次数的代码 import pprint message = 'It was a bright cold day in April, ' \ 'and th ...
- 斐讯K2路由器刷机教程
为了避免斐讯后门程序. 我用的win10系统 我刷的是华硕的老毛子 Padavan,我放的是压缩包,请解压到桌面! 下载地址: 链接:https://pan.baidu.com/s/1O_spSek- ...
- P3366 模板最小生成树
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz. 输入格式 第一行包含两个整数N,M,表示该图共有N个结点和M条无向边. 接下来M行每行包含三个整数 Xi,Yi,Zi,表 ...
- linux学习之grep
grep 可进行查找内容 如 cat logs/anyproxy.log | grep "2020080321000049" 还可以通过-v 反向过滤 如 tail -f log ...
- 深入理解Java内存(图解)
这篇文章是转自http://blog.csdn.net/shimiso/article/details/8595564博文. 本文分析基于jdk1.8 进入正题前首先要知道的是Java程序运行在JVM ...
- Laravel安装第一步:Windows 10 上laravel下载与安装需要注意。
1.下载了laravel,查看composer.json文件,搞清楚它需要的PHP版本 2.不要用 composer install !!! 用 composer -vvv install 这样 ...
- AE|蒙版、遮罩、轨道遮罩全面解析
相信很多初学者都有这样的困惑,搞不清蒙版和遮罩这两个概念的区别,甚至有的人认为它们就是一个东西. 这两个看似一样的概念,其实是有很大的区别的,今天主要从定义和作用方式这两个方面进行解析,相信对各位认识 ...
- 2.3Dmax界面_视图调整
一.试图模型显示效果的切换 '默认是真实显示效果' 线框模式 快捷键F3 ----> 真实显示效果和线框显示效果的切换(切换到线框显示效果再按F3就切换到了真实显示效果). 线面模式 快捷键F4 ...