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> ) } }
长风破浪会有时,直挂云帆济沧海
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!