react的组件通信

  1. 父子通信

    1. 父组件将一个数据传递给子组件,但是这个数据只有父组件有权利更改,子组件不可以
      代码:
        import React,{ Component,Fragment } from 'react'
     
     class Father extends Component {
         constructor () {
             super()
             this.state ={
                 name: 'xiaolongbao'
             }
         }
         changname = () => {
             this.setState({
                 name: 'baolongxiao'
             })
         }
         render() {
             let { name } = this.state
             return (
                 <Fragment>
                     <h3>father</h3>
                     <button onClick = { this.changname }>点击</button>
                     <Son name = { name }></Son>
                 </Fragment>
             )
         }
     }
     
     class Son extends Component {
         render() {
             let { name } = this.props
             return (
                 <Fragment>
                     <h3>son</h3>
                     <p> { name } </p>
                 </Fragment>
             )
         }
     }
     export default Father
    
    1. ref链绑定

      1. ref = “组件名称(son)”
      2. ref = { el => this.el = el} 如果是一个函数,这里的el指的就是当前组件 【推荐】
        代码:
        import React,{ Component,Fragment } from 'react'
        class Father extends Component {
            changname = () => {
                this.refs.son.setState({
                    name: 'baolongxiao'
                })
            }
            render() {
                return (
                    <Fragment>
                        <h3>father</h3>
                        <button onClick = { this.changname }>点击</button>
                        <Son ref = "son"></Son>
                    </Fragment>
                )
            }
        }
        
        class Son extends Component {
            constructor () {
                super()
                this.state ={
                    name: 'xiaolongbao'
                }
            }
            render() {
                let { name } = this.state
                return (
                    <Fragment>
                        <h3>son</h3>
                        <p> { name } </p>
                    </Fragment>
                )
            }
        }
        export default Father
      
  2. 子父通信
    父组件传递一个方法给子组件
    代码:

    	  import React,{ Component,Fragment } from 'react'
    	class Father extends Component {
    	    constructor () {
    	        super()
    	        this.state ={
    	            name: 'xiaolongbao'
    	        }
    	    }
    	    changname = () => {
    	        this.setState({
    	            name: 'baolongxiao'
    	        })
    	    }
    	    render() {
    	        let { name } = this.state
    	        return (
    	            <Fragment>
    	                <h3>father</h3>
    	                
    	                <Son name = { name } changname = { this.changname }></Son>
    	            </Fragment>
    	        )
    	    }
    	}
    	
    	class Son extends Component {
    	    render() {
    	        let { name,changname } = this.props
    	        return (
    	            <Fragment>
    	                <h3>son</h3>
    	                <button onClick = { changname }>点击</button>
    	                <p> { name } </p>
    	            </Fragment>
    	        )
    	    }
    	}
    	export default Father
    
  3. 跨组件通信(context)

    • 传统的写法
      代码:
     	import React, { Component,Fragment } from 'react'
    class GrandFather extends Component {
      constructor () {
        super()
        this.state = {
          money: 10000
        }
      }
    
      render () {
        return (
          <Fragment>
            <h3> grand-father 组件 </h3>
            <Father money = { this.state.money }></Father>
          </Fragment>
        )
      }
    }
    
    class Father extends Component {
      render () {
        return (
          <Fragment>
            <h3> father 组件  </h3>
            <Son money = { this.props.money }></Son>
          </Fragment>
        )
      }
    }
    class Son extends Component {
      render () {
        return (
          <Fragment>
            <h3> son 组件  </h3>
            <p> 爷爷给了我: { this.props.money } </p>
          </Fragment>
        )
      }
    }
    export default GrandFather
    

    原先的跨组件传递要一级一级的传递数据,这种形式很是低效,context的出现解决了这个低效的方案

    context 使用步骤:

    1. 创建context
      const MoneyContext = React.crateContext(默认值)

    2. 使用 创建的Context包裹目标组件的父组件

      <MoneyContext.Provider value = "20000">
        <Father></Father>
      </MoneyContext.Provider>
    
    1. 在目标组件中定义一个类属性 , 这个类属性叫做 contextType

    2. 直接在目标组件中 通过 this.context 就可以获得数据了

        class Son extends Component {
          static contextType = MoneyContext
          render () {
            return (
              <Fragment>
                <h3> son 组件  </h3>
                <p> 爷爷给了我: { this.context } </p>
              </Fragment>
            )
          }
        }
    

示例代码:

	import React, { Component,Fragment } from 'react'
	
	const MoneyContext = React.createContext('10000')
	
	class GrandFather extends Component {
	
	  render () {
	    return (
	      <Fragment>
	        <h3> grand-father 组件 </h3>
	        <MoneyContext.Provider value = "20000">
	            <Father></Father>
	        </MoneyContext.Provider>
	      </Fragment>
	    )
	  }
	}
	
	class Father extends Component {
	  render () {
	    return (
	      <Fragment>
	        <h3> father 组件  </h3>
	        <Son></Son>
	      </Fragment>
	    )
	  }
	}
	class Son extends Component {
	    static contextType = MoneyContext
	  render () {
	    return (
	      <Fragment>
	        <h3> son 组件  </h3>
	        <p> 爷爷给了我: { this.context } </p>
	      </Fragment>
	    )
	  }
	}
	export default GrandFather
React组件通信可以通过props属性进行传递数据。子组件可以通过props接收父组件传递的数据,并进行相应的操作。在函数式组件中,可以直接通过props对象来获取父组件传递的数据。在类组件中,需要使用this.props来获取父组件传递的数据。\[1\] 另外,子组件也可以通过调用父组件传递过来的函数来实现子传父的通信。子组件可以将需要传递的数据作为函数的实参传入,并在子组件内部调用该函数。这样就可以将子组件的数据传递给父组件进行处理。\[3\] 总结起来,React组件通信可以通过props属性进行父传子和子传父的数据传递和操作。父组件通过props将数据传递给子组件,子组件通过props接收父组件传递的数据。子组件可以通过调用父组件传递的函数来将子组件的数据传递给父组件进行处理。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [React组件通信](https://blog.youkuaiyun.com/weixin_52148548/article/details/125287315)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [react组件通信](https://blog.youkuaiyun.com/weixin_39818813/article/details/125737028)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值