React中子组件什么时候会触发render

本文探讨了React组件在更新阶段的生命周期,重点在于当父组件render时如何影响子组件的更新。作者发现子组件即使props未变也会render,原因在于未在shouldComponentUpdate中进行props变化判断。同时,梳理了React旧版生命周期,包括constructor、componentWillReceiveProps、shouldComponentUpdate等关键方法的作用。理解这些知识点对于优化React应用性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的起因是我写一个demo的时候,子组件中没有使用this.setState,父组件传给子组件的props也没有变,但是我的子组件还是render了。(除了挂载阶段的render)
让我百思不得其解,于是重新回去梳理了一下React的生命周期,究竟什么可以引发我子组件的render?

子组件的更新分为两种情况
第一种: 父组件render,导致重传props
如果我们在子组件中是直接使用this.props.xxx 那么可以在shouldcomponentUpdata判断props是否变化
如果我们是将父组件的属性转化为自己的state,则可以在componentWillReceiveProps时,用this.setState更新自己state的状态。
第二种:自身调用this.setState

我出现的问题的答案在于,我的父组件render,导致重传props,但是我没有在shouldcomponentUpdata中判断props是否变化,所以就默认为true,所以我的子组件再一次更新

再给大家梳理一下React旧版的生命周期

1.初始化阶段

1.1constructor
做一些初始化工作,比如定义this.state

2.挂载阶段Mount

2.1 componentWillMount
组件挂载前使用,不常用
2.2 render
根据props和state return一个React元素
render方法是一个纯函数
2.3 componentDidMount
组件挂载到Dom后调用且只会调用一次

3.更新阶段Update

这里敲重点!!
问题来了,子组件什么时候会更新?这就是我们最开始抛出来的问题
子组件的更新分为两种情况
第一种: 父组件render,导致重传props
如果我们在子组件中是直接使用this.props.xxx 那么可以在shouldcomponentUpdata判断props是否变化
如果我们是将父组件的属性转化为自己的state,则可以在componentWillReceiveProps时,用this.setState更新自己state的状态。
第二种:自身调用this.setState
3.1 componentWillReceiveProps(nextProps)
此方法只有在第一种情况,props引起的更新才会调用,父组件会传新的props,但不一定是有变化的,所以可以在这里判断是否有变化,我最开始的问题就是,我的父组件重新render了,所以重新传子组件props,但是我没有判断它有没有变化,没有拦截,子组件就会默认render
3.2 shouldComponentUpdata(nextProps,nextState)
返回的是bool值,如果是false则不render
3.3 componentWillUpdate
render前,很少用
3.4 render
3.5 componentDidUpdate
组件更新后被调用,可以操作组件更新的DOM

4.卸载阶段

4.1componentWillUnmount
卸载前调用,可以做一些清理工作
比如清除组件中使用的定时器等

React V16.4之后用
static getDevivedStateFromProps(props,state)
在组件创建和render之前使用,
也就是说取代了:
componentWillMount
componentWillReceiveProps
componentWillUpdate在这里插入图片描述

在这里插入图片描述

### React Class 组件中子组件父组件传递参数的方法 在 React 中,可以通过回调函数的方式让子组件父组件传递数据。具体来说,在父组件定义一个方法并通过 `props` 将该方法传递给子组件。当子组件调用这个方法时,可以将需要的数据作为参数传递回父组件。 以下是详细的实现方式: #### 实现步骤说明 1. **父组件定义回调函数** 在父组件内部定义一个处理逻辑的函数,并将其绑定到当前实例上以便于正确访问状态或属性。 2. **通过 props 将回调函数传递至子组件** 把上述定义好的函数作为一个 prop 属性赋值给子组件。 3. **子组件触发回调并将数据返回给父组件** 当特定事件发生时(比如按钮点击),子组件可以直接调用从父组件接收到的回调函数,并附带所需传输的信息。 #### 示例代码展示 ```javascript // 父组件 (ParentComponent.js) import React, { Component } from 'react'; class ParentComponent extends Component { constructor(props) { super(props); this.state = { messageFromChild: '' }; } // 定义接收消息的回调函数 handleMessageFromChild = (childMessage) => { this.setState({ messageFromChild: childMessage }); }; render() { return ( <div> {/* 显示来自子组件的消息 */} <h3>Message From Child: {this.state.messageFromChild}</h3> {/* 通过 props 将回调函数传递给子组件 */} <ChildComponent onSendMessage={this.handleMessageFromChild} /> </div> ); } } export default ParentComponent; // 子组件 (ChildComponent.js) import React, { Component } from 'react'; class ChildComponent extends Component { sendMessageToParent = () => { const message = "Hello, I'm the Child!"; // 调用父组件传入的回调函数并发送消息 if (typeof this.props.onSendMessage === 'function') { this.props.onSendMessage(message); } }; render() { return ( <button onClick={this.sendMessageToParent}> Send Message to Parent </button> ); } } ``` 在这个例子中,`handleMessageFromChild` 是由父组件定义的一个方法[^1],它被设置为子组件的 `onSendMessage` 属性的一部分。一旦用户点击了子组件内的按钮,则会执行 `sendMessageToParent` 函数来通知其父级更新显示的内容[^2]。 #### 关键点解析 - **回调机制的应用**: 这种模式利用 JavaScript 的闭包特性使得即使是在不同的作用域下也能安全有效地共享行为和数据流控制权。 - **单向数据流动原则**: 数据总是自顶向下流动;即只有父节点能够改变自己的 state 或者修改子节点的行为/外观,而反过来则不行——除非借助额外手段像这里介绍过的那样建立显式的通信桥梁。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值