React中父子组件通信详解

 更新时间:2022年08月28日 11:43:10   作者:公众号_前端每日技巧  
这篇文章主要介绍了React中父子组件通信详解,在父组件中,为子组件添加属性数据,即可实现父组件向子组件通信,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

父组件向子组件通信

在父组件中,为子组件添加属性数据,即可实现父组件向子组件通信。传递的数据可以分成两类

子组件是作为属性来接收这些数据的

第一类就是数据:变量,对象,属性数据,状态数据等等

这些数据发生改变,子组件接收的属性数据就发生了改变。

第二类就是方法:父组件可以向子组件传递属性方法,子组件接收方法,并可以在组件内执行,有两种执行方式

注意:父组件传给子组件的方法是不能执行的,执行了相当于将方法的返回值传递给子组件。

第一种 作为事件回调函数执行

参数默认就是事件对象

this默认指向undefined,因此我们要改变this指向

如果在子组件中改变,

this指向子组件

bind方式传递的参数在事件对象之前

如果在父组件中改变(​​工作中常用​​)

this指向父组件了

此时子组件不论如何绑定,都指向父组件

bind方式传递的参数会在子组件传递的参数之前

参数顺序:父组件参数,子组件参数,事件对象

第二种 在子组件方法中执行

默认没有参数,使用什么可以传递什么

this默认指向子组件属性对象(this.props)

此时我们要在父组件中绑定this,就指向了父组件

我们既可以访问父组件实例化对象,也可以访问子组件实例化对象,

我们既可以在子组件中传递参数,也可以在父组件中传递参数

有一种简写方式(​​工作中常用​​)

直接在事件回调函数中,定义箭头函数,并执行父组件方法:

// 定义父组件slider
class Slider extends Component {
// 构造函数
constructor(props) {
super(props);
// 初始化状态
this.state = {
title: '返回顶部'
}
}
// 父组件方法
parentMethod() {
console.log(this, arguments)
}
render() {
return (
<div className="slider">
{/*字符串*/}
{/*<GoTop text="网址导航"></GoTop>*/}
{/*属性数据*/}
{/*<GoTop text={this.props.title}></GoTop>*/}
{/*状态数据*/}
{/*<GoTop text={this.state.title}></GoTop>*/}
{/*传递方法*/}
<GoTop text={this.state.title} method={this.parentMethod.bind(this, 200, 'parent')}></GoTop>
{/*<GoTop text={this.state.title} method={this.parentMethod}></GoTop>*/}
</div>
)
}
}
// 定义组件
class GoTop extends Component {
// 定义方法
childMethod(e) {
// 执行父组件方法
this.props.method(200, e);
}
// 4 渲染虚拟DOM
render() {
// console.log(this.props)
// 绑定事件
// return <span onClick={this.props.method.bind(this, 100, 'child')}>{this.props.text}</span>
// 在子组件方法中执行
// return <span onClick={this.childMethod.bind(this)}>{this.props.text}</span>
// 简便写法
return <span onClick={e => this.props.method(e)}>{this.props.text}</span>
}
}

存在期

组件创建完成,一旦属性数据或者状态数据发生改变,组件就会进入存在期,共分五个阶段

第一个阶段 组件即将接收新的属性数据

componnetWillReceiveProps方法

第一个参数表示​​新的​​属性数据

组件实例化对象上的是旧的属性数据

数据还没有更新,

​只有当属性数据发生改变,才会执行该方法,状态数据改变不会执行​​,直接进入第二个阶段

作用:用属性数据去更新状态数据,实现数据由外部流入内部

第二个阶段 组件是否应该更新

shouldComponentUpdate方法

第一个参数表示​​新的​​属性数据

第二个参数表示​​新的​​状态数据

组件实例化对象上的是旧的属性数据

组件实例化对象上的是旧的状态数据

必须有返回值,表示是否可以更新

true 可以更新

false 不能更新

工作中,我们常常比较

参数中的属性数据是否与组件实例化对象中属性数据是否不相等,或者

参数中的状态数据是否与组件实例化对象中状态数据是否不相等

作用:启动更新优化的作用,常常在高频事件中使用。(类似节流作用)

第三个阶段 组件即将更新

componentWillUpdate方法:

  • 第一个参数表示​​新的​​属性数据
  • 第二个参数表示​​新的​​状态数据

组件实例化对象上的是旧的属性数据

组件实例化对象上的是旧的状态数据

说明此时数据仍然没有更新,当该方法执行完毕,数据才会更新

作用:更新插件,预处理数据等等,

注意:不要在第二个阶段和第三个阶段去更新属性数据以及装填数据

第四个阶段 组件渲染视图

render 方法

没有参数,但是此时数据已经更新了

  • 组件实例化对象上的是​​新的​​属性数据
  • 组件实例化对象上的是​​新的​​状态数据

所以我们在渲染虚拟DOM的时候,可以使用这些新的数据了

此时虚拟DOM还没有更新,方法执行完毕,虚拟DOM才更新

第五个阶段 组件更新完成

componentDidUpdate方法:

  • 第一个参数是旧的属性数据
  • 第二个参数是旧的状态数据

组件实例化对象上的是​​新的​​属性数据

组件实例化对象上的是​​新的​​状态数据

此时虚拟DOM也已经更新完成了

组件更新完成了,我们可以在这个阶段发送请求,处理事件等等,该方法执行完毕,并没有说明存在期的结束,存在期仍然继续,只是一次更新的结束,所有组件生命周期方法this都指向组件实例化对象

// 定义组件
class GoTop extends Component {
// 构造函数
constructor(props) {
super(props);
this.state = {
text: props.text
}
}
// 存在期五个阶段
// 1 组件即将接收新的属性数据
componentWillReceiveProps(newProps) {
console.log(111, 'componentWillRecieveProps', newProps, this.props)
// 将属性数据,存储到状态中
this.setState({ text: newProps.text })
}
// 2 组件是否更新
shouldComponentUpdate(newProps, newState) {
console.log(222, 'shouldComponentUpdate', newProps, this.props, 'state', newState, this.state)
// 是否可以更新
// return true;
// 根据属性或者状态的改变来优化
return newProps.text !== this.props.text || newState.text !== this.state.text
}
// 3 组件即将更新
componentWillUpdate(newProps, newState) {
console.log(333, 'componentWillUpdate', newProps, this.props, 'state', newState, this.state, findDOMNode(this).innerHTML)
}
// 4 渲染虚拟DOM
render() {
console.log(444, 'render', this.props, 'state', this.state)
// return <span>{this.props.text}</span>
return <span>{this.state.text}</span>
}
// 5 组件更新完成
componentDidUpdate(oldProps, oldState) {
console.log(555, 'componentDidUpdate', oldProps, this.props, 'state', oldState, this.state, findDOMNode(this).innerHTML)
}
// 组件创建完成
componentDidMount() {
window.onscroll = () => {
// 移动超过300显示返回顶部
if (window.scrollY > 300) {
this.setState({
text: '返回顶部'
})
} else {
// 显示头条新闻
this.setState({
text: '头条新闻'
})
}
// console.log(window.scrollY)
}
}
}

到此这篇关于React中父子组件通信详解的文章就介绍到这了,更多相关React组件通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用react完成点击返回顶部操作

    使用react完成点击返回顶部操作

    本文主要介绍了使用react完成点击返回顶部操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 详解React中的setState执行机制

    详解React中的setState执行机制

    setState是React组件中用于更新状态的方法,是类组件中的方法,用于更新组件的状态并重新渲染组件,本文给大家详细介绍了React中的setState执行机制,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • react事件对象无法获取offsetLeft,offsetTop,X,Y等元素问题及解决

    react事件对象无法获取offsetLeft,offsetTop,X,Y等元素问题及解决

    这篇文章主要介绍了react事件对象无法获取offsetLeft,offsetTop,X,Y等元素问题及解决方案,具有很好的参考价值,希望对大家有所帮助。
    2022-08-08
  • 深入了解React中的虚拟DOM

    深入了解React中的虚拟DOM

    欢迎来到今天的探险之旅!在这篇博客中,我们将深入了解 React 中神奇的虚拟DOM,并通过一个简单的例子来揭开其神秘面纱,文中通过代码示例也讲解非常详细,感兴趣的朋友可以参考下
    2024-01-01
  • react hooks深拷贝后无法保留视图状态解决方法

    react hooks深拷贝后无法保留视图状态解决方法

    这篇文章主要为大家介绍了react hooks深拷贝后无法保留视图状态解决示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • react-player实现视频播放与自定义进度条效果

    react-player实现视频播放与自定义进度条效果

    本篇文章通过完整的代码给大家介绍了react-player实现视频播放与自定义进度条效果,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-01-01
  • 简化Cocos和Native交互利器详解

    简化Cocos和Native交互利器详解

    这篇文章主要为大家介绍了简化Cocos和Native交互利器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React引入css的几种方式及应用小结

    React引入css的几种方式及应用小结

    这篇文章主要介绍了React引入css的几种方式及应用小结,操作styled组件的样式属性,可在组件标签上定义属性、也可以通过attrs定义属性,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • React结合Drag API实现拖拽示例详解

    React结合Drag API实现拖拽示例详解

    这篇文章主要为大家介绍了React结合Drag API实现拖拽示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • react项目中@路径简单配置指南

    react项目中@路径简单配置指南

    这篇文章主要给大家介绍了关于react项目中@路径简单配置的相关资料,文中还介绍了React配置@路径别名的方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论