React中组件进行render的情况
1、初始化
React在应用初始化的时候,会渲染全部组件,组件的挂载过程见文章《React(三):组件生命周期》中的介绍。
2、setState()在任何情况下都会导致组件的重新渲染,即使state未发生变化
当一个组件调用了setState()函数时,不论state是否发生了变化,该组件都将被重新渲染。
例如:
import React from 'react';
class Test extends React.Component{
constructor(props) {
super(props);
this.state = {
strTest:"render测试" //初始化state中strTest值
}
}
//这里调用了setState但是并没有改变setState中的值
handleClick = () => {
const prestrTest = this.state.strTest;
this.setState({
prestrTest:this.state.strTest
})
}
render(){
//当render函数被调用时,打印当前的strTest
console.log(this.state.strTest)
return(
<h1 onClick = {this.handleClick}>
{this.state.strTest}
</h1>)
}
}
export default Test;
初始化该组件,页面显示“render测试”,控制台也输出"render测试“,点击页面字符串”render测试“,页面UI未发生变化,但是控制台输出了10次"render测试",可见setState()会导致组件重新渲染,即使state未发生改变。
![]()
3、只要父组件重新渲染了,那么子组件就会重新渲染
即使组件未发生变化,并且从父组件接收的props也没有发生变化,但是只要父组件重新渲染了,那么子组件就会重渲染。

假设父组件中的state设置了一个数组,该数组通过函数传递至四个子组件中,每个组件分别显示内容1,2,3,4。当点击子组件1,更改对应的state,会导致父组件state中的数组发生改变,父组件重新渲染,继而导致所有的子组件全部重新渲染,即使子组件2,3,4自身并未发生变化,接收到的props也未发生变化。
import React from 'react';
class Son extends React.Component{
render(){
const {index,number,handleClick} = this.props;
console.log(number);
return(
<h1 onClick ={() => handleClick(index)}>
{number}
</h1>
)
}
}
class Father extends React.Component{
constructor(props) {
super(props);
this.state = {
numberArray:[1,2,3,4]
}
}
//点击后使numberArray中数组下标为index的数字值发生变化,重渲染对应的Son组件
handleClick = (index) => {
let preNumberArray = this.state.numberArray;
preNumberArray[index] += 4;
this.setState({
numberArray:preNumberArray
})
}
render(){
return(
<div>{
this.state.numberArray.map(
(number,key) => {
return(
<Son
key = {key}
index = {key}
number ={number}
handleClick ={this.handleClick}/>
)
}
)
}
</div>
)
}
}
export default Father

React的组件重渲染机制,是一个严谨的做法,因为它避免了,状态更新后,手动去重渲染相关组件的操作。但是有些时候我们更新了某个组件的数据,但是并不想让与其相关的其他组件被重渲染,因为反复的重渲染未变化的组件,既耗时也会影响性能,此时就需要对React的重渲染进行优化,详细的介绍见文章《React(六):重渲染优化》。
欢迎关注公众号“洁儿的漫漫求学路”,互相学习,共同进步~
版权声明:本文为u012131835原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。