React组件通信如何实现

其他教程   发布日期:2023年09月06日   浏览次数:368

这篇文章主要介绍“React组件通信如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React组件通信如何实现”文章能帮助大家解决问题。

    1. 父子组件通信方式

    父子组件之间的通信很常见,其中父组件可以通过props,原型方法向子组件通信,同时子组件也可以用回调函数,事件冒泡向父组件通信

    父传子

    原型方法

    父组件通过React.createRef()创建Ref,保存在实例属性myRef上。父组件

    中,渲染子组件时,定义一个Ref属性,值为刚创建的myRef。

    父组件调用子组件的myFunc函数,传递一个参数,子组件接收到参数,打印出参数。

    this.props

    name作为props由父组件传递给子组件,子组件拿到name后,渲染在页面上。参数有父组件传递给子组件

    1. import React, { Component, Fragment } from 'react';
    2. class Son extends Component {
    3. myFunc(name) {
    4. console.log(name);
    5. }
    6. render() {
    7. return <></>;
    8. }
    9. }
    10. // 父组件
    11. export default class Father extends Component {
    12. constructor(props) {
    13. super(props);
    14. // 创建Ref,并保存在实例属性myRef上
    15. this.myRef = React.createRef();
    16. }
    17. componentDidMount() {
    18. // 调用子组件的函数,传递一个参数
    19. this.myRef.current.myFunc('Jack');
    20. }
    21. render() {
    22. return (
    23. <>
    24. <Son ref={this.myRef} />
    25. </>
    26. );
    27. }
    28. }

    子传父

    • 回调函数

    • 事件冒泡

    在子组件内部,修改了父组件中的值,从而完成了子组件向父组件通信

    1. import React, { Component } from 'react'
    2. class Navbar extends Component{
    3. render(){
    4. return <div style={{background:"red"}}>
    5. <button onClick={()=>{
    6. console.log("子通知父, 让父的isSHow 取反。",this.props.event)
    7. this.props.event() //调用父组件传来啊的回调函数
    8. }}>click</button>
    9. <span>navbar</span>
    10. </div>
    11. }
    12. }
    13. class Sidebar extends Component{
    14. render(){
    15. return <div style={{background:"yellow",width:"200px"}}>
    16. <ul>
    17. <li>11111</li>
    18. </ul>
    19. </div>
    20. }
    21. }
    22. export default class App extends Component {
    23. state = {
    24. isShow:false
    25. }
    26. handleEvent = ()=>{
    27. this.setState({
    28. isShow:!this.state.isShow
    29. })
    30. // console.log("父组件定义的event事件")
    31. }
    32. render() {
    33. return (
    34. <div>
    35. <Navbar event={this.handleEvent}/>
    36. {/* <button onClick={()=>{
    37. this.setState({
    38. isShow:!this.state.isShow
    39. })
    40. }}>click</button> */}
    41. {this.state.isShow && <Sidebar/>}
    42. </div>
    43. )
    44. }
    45. }
    46. /*
    47. 父传子 :属性,
    48. 子传父: 回调函数 callback
    49. */

    2. 非父子组件通信方式

    状态提升

    React中的状态提升概括来说,就是将多个组件需要共享的状态提升到它们最近的父组件上.在父组件上改变这个状态然后通过props

    发布订阅模式实现

    context状态树传参

    1. a. 先定义全局context对象
    2. import React from 'react'
    3. const GlobalContext = React.createContext()
    4. export default GlobalContext
    1. b. 根组件引入GlobalContext,并使用GlobalContext.Provider(生产者)
    2. //重新包装根组件 class App {}
    3. <GlobalContext.Provider
    4. value={{
    5. name:"kerwin",
    6. age:100,
    7. content:this.state.content,
    8. show:this.show.bind(this),
    9. hide:this.hide.bind(this)
    10. }}
    11. >
    12. <之前的根组件></之前的根组件>
    13. </GlobalContext.Provider>
    1. c. 任意组件引入GlobalContext并调用context,使用GlobalContext.Consumer(消费者)
    2. <GlobalContext.Consumer>
    3. {
    4. context => {
    5. this.myshow = context.show; //可以在当前组件任意函数触发
    6. this.myhide = context.hide;//可以在当前组件任意函数触发
    7. return (
    8. <div>
    9. {context.name}-{context.age}-{context.content}
    10. </div>
    11. )
    12. }
    13. }
    14. </GlobalContext.Consumer>

    注意:GlobalContext.Consumer内必须是回调函数,通过context方法改变根组件状态

    context优缺点:

    优点:跨组件访问数据

    缺点:react组件树种某个上级组件shouldComponetUpdate 返回false,当context更新时,不会引起下级组件更新

    以上就是React组件通信如何实现的详细内容,更多关于React组件通信如何实现的资料请关注九品源码其它相关文章!