Diffing 算法是 React DOM 高效渲染的很关键的概念。
下面通过一个简单的代码示例来简单验证一下 Diffing 算法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>简单验证 Diffing 算法</title>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="app"></div>
<!-- step01: 引入react核心库 -->
<script type="text/javascript" src="../js/17/react.development.js"></script>
<!-- step02: 引入react-dom,用于支持react操作DOM -->
<script type="text/javascript" src="../js/17/react-dom.development.js"></script>
<!-- step03: 引入babel,用于将jsx转为js -->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel"> /* 此处一定要写babel */
class Time extends React.Component {
state = {date: new Date()}
componentDidMount() {
setInterval(() => {
this.setState({
date: new Date()
})
}, 1000)
}
render() {
return (
<div style={{border:"1px solid #999",padding: "20px", width: "400px", margin: "20px auto"}}>
<h1>显示时间</h1>
<input type="text"/><br/><br/>
<span>现在是:{this.state.date.toTimeString()}</span>
</div>
)
}
}
ReactDOM.render(<Time/>, document.getElementById('app'));
</script>
</body>
</html>
运行结果:

上面的代码中创建了一个 Time 的组件,该组件中包含 3 个元素: h1、input、span ,其中 span 标签的内容渲染了 state 的内容。
组件挂载完毕后,启动了定时器,每秒更新 state 的数据。
state 的更新会导致组件 DOM 的重新渲染。
那么怎么证明 Diffing 算法呢?
其实很简单,就是在输入框内输入内容,如果
span内的时间每秒更新时,如果输入框的内容不消失,证明input没有重新渲染。同一个组件在一次渲染中,组件的一部分 DOM 渲染,另一部分 DOM 没有重新渲染,就是 Diffing 算法的体现。
简单总结一下,Diffing 算法就是 React DOM 渲染过程中,通过 key 对比更新前后虚拟 DOM 节点的内容,对于内容改变了的虚拟 DOM 节点会重新渲染为真实的 DOM 节点,对于内容没有改变的节点则不会重新渲染,还是使用之前的真实 DOM,以提高效率。