在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. curl下载远程图片到服务器

    <?php //curl下载远程图片到服务器 方法 function download($url, $path = 'images/'){ $ch = curl_init(); $names = ...

  2. 面向对象3(Java)

    多态 基本介绍 即同一方法可以根据发送对象的不同而采用多种不同的行为方式 一个对象的实际类型是确定的,但是可以指向对象的引用类型可以很多 多态存在的条件:a.有继承关系:b.子类重写父类方法:c.父类 ...

  3. 字典:求和计数(return知识巩固)

    野餐用品计数 之前写过一段,字符在字符串中出现次数的代码 import pprint message = 'It was a bright cold day in April, ' \ 'and th ...

  4. 斐讯K2路由器刷机教程

    为了避免斐讯后门程序. 我用的win10系统 我刷的是华硕的老毛子 Padavan,我放的是压缩包,请解压到桌面! 下载地址: 链接:https://pan.baidu.com/s/1O_spSek- ...

  5. P3366 模板最小生成树

    题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz. 输入格式 第一行包含两个整数N,M,表示该图共有N个结点和M条无向边. 接下来M行每行包含三个整数 Xi,Yi,Zi,表 ...

  6. linux学习之grep

    grep 可进行查找内容 如 cat logs/anyproxy.log | grep "2020080321000049" 还可以通过-v 反向过滤 如 tail -f  log ...

  7. 深入理解Java内存(图解)

    这篇文章是转自http://blog.csdn.net/shimiso/article/details/8595564博文. 本文分析基于jdk1.8 进入正题前首先要知道的是Java程序运行在JVM ...

  8. Laravel安装第一步:Windows 10 上laravel下载与安装需要注意。

    1.下载了laravel,查看composer.json文件,搞清楚它需要的PHP版本 2.不要用 composer install !!! 用  composer -vvv install   这样 ...

  9. AE|蒙版、遮罩、轨道遮罩全面解析

    相信很多初学者都有这样的困惑,搞不清蒙版和遮罩这两个概念的区别,甚至有的人认为它们就是一个东西. 这两个看似一样的概念,其实是有很大的区别的,今天主要从定义和作用方式这两个方面进行解析,相信对各位认识 ...

  10. 2.3Dmax界面_视图调整

    一.试图模型显示效果的切换 '默认是真实显示效果' 线框模式 快捷键F3 ----> 真实显示效果和线框显示效果的切换(切换到线框显示效果再按F3就切换到了真实显示效果). 线面模式 快捷键F4 ...