react组件传值

父传子

//父组件
import React, { Component } from 'react'
import Son from '../son/son'
export default class father extends Component {
  state = {
    msg: '我是父组件的值'
  }
  render () {
    return (
      <>
        {/* 自定义属性 */}
        <Son msg={this.state.msg}></Son>
      </>
    )
  }
}

//子组件
import React, { Component } from 'react'
export default class son extends Component {
  render () {
    return (
      // 用this.props接收
      <div>{this.props.msg}</div>
    )
  }
}

子传父

//子组件
import React, { Component } from 'react'

export default class son extends Component {
  state = {
    sonmsg: '我是子组件的值'
  }
  hendlemysonmsg (val) {
    // 通过this.props将子组件的值发送到父组件
    // myBtn是自定义事件名
    this.props.myBtn(val)
  }
  render () {
    return (
      <>
        {/* 用this.props接收 */}
        <div>{this.props.msg}</div>
        {/* 子组件当父组件传值类型于vue中的自定义事件 */}
        <button onClick={() => this.hendlemysonmsg(this.state.sonmsg)}>子传父</button>
      </>
    )
  }
}


//父组件
import React, { Component } from 'react'
import Son from '../son/son'
export default class father extends Component {
  state = {
    msg: '我是父组件的值'
  }
  hendlemyBtn (val) {
    console.log(val)  //我是子组件的值
  }
  render () {
    return (
      <>
        {/* 自定义属性 */}
        <Son msg={this.state.msg} myBtn={(val) => this.hendlemyBtn(val)}></Son>
      </>
    )
  }
}

跨级组件

单独创建Context.js文件 ,结构出我们需要的Provider(供应方)和Consumer(消费方)
import { createContext } from 'react'
//从createContext中解构出两个组件
const { Provider, Consumer } = createContext()
export { Provider, Consumer }

祖先组件向子孙类组件传值

//这是祖先组件
import React, { Component } from 'react'

//从context.js文件中导入Provider组件
import { Provider } from '../util/context'
import Father from '../father/father'

export default class grandfather extends Component {
  state = {
    ismsg: '我是祖先组件的值',
    num: 1
  }
    //该函数会传递到子孙类组件中,
    //当前val就是孙组件传递过来的值==>99  从而改变祖先组件中的num
  handlechannum = (val) => {
    this.setState({
      num: this.state.num + val
    })
  }
  render () {
    return (
       {/* Provider包裹根元素(这样Provider就是最大的根元素)
        value中可以传单个值,也可以传一个对象包含多个值,
        可以传一个函数:在子孙类组件中可以调用这个函数,也可以给这个函数传值,从而改变祖先组件
       */}
      <Provider value={{ 'ismsg': this.state.ismsg, "changenum": (val) => this.handlechannum(val), 'num': this.state.num }}>
        <Father></Father>
      </Provider>
    )
  }
}


//孙类组件
import React, { Component } from 'react'
import { Consumer } from '../util/context'

export default class son extends Component {
  render () {
    return (
      <Consumer>
        {
          (data) => {
            //在Consumer组件中的回调函数的参数里可以获取Provider组件提供的value
            console.log(data)
            let { changenum } = data
            //data中的数据是响应式的
            return (
              <>
                {/* 我是祖先组件的值 */}
                <div>{data.ismsg}</div>
                {/* ()=>必须写,不然会死循环 */}
                <button onClick={() => changenum(99)}>利用祖先组件传递过来的函数,向祖先组件传值</button>
                <div>{data.num}</div>
              </>
            )
          }
        }
      </Consumer>
    )
  }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容