对于 React 中 Component 和 PureComponent 的理解
程序员文章站
2022-03-26 08:42:26
...
一、Component 和 PureComponent
- 在
React
中,Component
存在的问题,如下所示:
- 父组件重新
render()
, 当前组件也会重新执行render()
, 即使没有任何变化 - 当前组件
setState()
, 重新执行render()
, 即使state
没有任何变化
- 对于
React
中解决Component
存在的问题,如下所示:
- 原因,组件的
componentShouldUpdate()
默认返回true
, 即使数据没有变化render()
都会重新执行 - 办法一,重写
shouldComponentUpdate()
, 判断如果数据有变化返回true
, 否则返回false
- 办法二,用
PureComponent
代替Component
- 说明,一般都使用
PureComponent
来优化组件性能
- 在
React
中,PureComponent
的基本原理,如下所示:
- 重写实现
shouldComponentUpdate()
- 对组件的新/旧
state
和props
中的数据进行浅比较, 如果都没有变化, 返回false
, 否则返回true
- 一旦
componentShouldUpdate()
返回false
不再执行用于更新的render()
-
在
shouldComponentUpdate
中,用来决定当前组件是否应该重新render()
, 如果返回true
, 就会去重新render()
, 否则结束。shouldComponentUpdate
包含两个参数,nextProps
和nextState
。如果this.props.m1===nextProps.m1 && this.state.m2===nextState.m2
,比较新旧props
中的和state
数据, 如果没有一个变化的返回false
, 否则true
。 -
对于
React
中Component
和PureComponent
的简单应用,代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>component与pureComponent</title>
</head>
<body>
<div id="example"></div>
<script type="text/javascript" src="./js/react.development.js"></script>
<script type="text/javascript" src="./js/react-dom.development.js"></script>
<script type="text/javascript" src="./js/babel.min.js"></script>
<script type="text/babel">
class A extends React.Component {
state = {
m1: {count: 1}
}
test1 = () => {
/*this.setState(state => ({
m1: {count: state.m1.count + 1}
}))*/
// const m1 = this.state.m1
// m1.count = 2
// this.setState({m1})
// this.setState({m1: {...m1}})
this.setState({})
}
render() {
console.log('A render()')
return (
<div>
<h1>A组件: m1={this.state.m1.count}</h1>
<button onClick={this.test1}>A 测试1</button>
<B m1={this.state.m1}/>
</div>
)
}
}
class B extends React.PureComponent {
state = {
m2: 1
}
test2 = () => {
this.setState({})
}
/*shouldComponentUpdate (nextProps, nextState) {
console.log('shouldComponentUpdate()')
// 比较新旧props中的和state数据, 如果没有一个变化的返回false, 否则true
if(this.props.m1===nextProps.m1 && this.state.m2===nextState.m2) {
return false
} else {
return true
}
// return true // Component中的默认为true
}*/
render() {
console.log('B render()')
return (
<div>
<h1>B组件: m2={this.state.m2}, m1.count={this.props.m1.count}</h1>
<button onClick={this.test2}>B 测试2</button>
</div>
)
}
}
ReactDOM.render(<A/>, document.getElementById('example'))
</script>
</body>
</html>
二、React 中 Component 和 PureComponent 的常见面试题
- 组件的哪个生命周期勾子能实现组件优化?
shouldComponentUpdate
-
PureComponent
的原理是什么?
重写实现
shouldComponentUpdate()
;对组件的新/旧state
和props
中的数据进行浅比较, 如果都没有变化, 返回false
, 否则返回true
;一旦componentShouldUpdate()
返回false
不再执行用于更新的render()
-
Component
与PureComponent
的区别是什么?
使用
PureComponent
代替Component
,可以优化组件性能
上一篇: C#图书管理系统 附源码下载
推荐阅读
-
Oracle、mysql和sqlserver数据库中对于事务的不同理解
-
我对于js中apply()和call()和push()的理解
-
对于Python中@property的理解和使用
-
Oracle、mysql和sqlserver数据库中对于事务的不同理解
-
React中Suspense及lazy()懒加载及代码分割原理和使用的理解
-
MySQL中对于NULL值的理解和使用教程_MySQL
-
MySQL中对于NULL值的理解和使用教程_MySQL
-
React router的Route中component和render属性理解
-
对于 React 中 Component 和 PureComponent 的理解