React父子通信(受控组件)

一、子组件传父组件

新建组件Childtheparent.js写入:

import React, { Component } from 'react'

class Navbar extends Component {
  render() {
    return (
      <div style={{background: "red"}}>
          <button onClick={() => {
            //   console.log(this.props.event)
              this.props.event()
          }}>click</button>
          <span>navbar</span>
      </div>
    )
  }
}

class Sidebar extends Component {
    render() {
      return (
        <div style={{background: "green", width: "100px"}}>
            <ul>
                <li>1111</li>
                <li>1111</li>
                <li>1111</li>
                <li>1111</li>
                <li>1111</li>
            </ul>
        </div>
      )
    }
  }

export default class Childtheparent extends Component {
  state = {
      isShow: false
  }  
  eventHandle = () => {
      console.log('父组件定义函数')
      this.setState({
          isShow: !this.state.isShow
      })
  }
  render() {
    return (
      <div>
          <Navbar event={this.eventHandle}></Navbar>
          {this.state.isShow && <Sidebar></Sidebar>}
      </div>
    )
  }
}

可以看到子传父的话,子组件接收一个父组件传进来的回调函数,点击时执行即可。
效果:
在这里插入图片描述
在这里插入图片描述


二、选项卡案例应用(受控组件)

我的这篇选项卡案例博客中进行修改。
新建一个TabLi.js将选项卡列表写到这个组件中:

import React, { Component } from 'react'

export default class TabLi extends Component {
    state = {
        list: [
            {
                id: 1,
                name: '电影'
            },
            {
                id: 2,
                name: '影院'
            },
            {
                id: 3,
                name: '我的'
            }
        ],
        lIndex: 0
    }
  render() {
    return (
      <div>
          <ul>
              {
                this.state.list.map((item, index) => 
                    <li onClick={() => {
                        this.indexHandle(index)
                    }} className={this.state.lIndex === index ? 'active' : ''} key={item.id}>{item.name}</li>
                )
              }
          </ul>
      </div>
    )
  }
  indexHandle(index) {
    this.setState({
        lIndex: index
    })
    this.props.event(index)
    // 该通知父组件修改lIndex
}
}

在这里插入图片描述
可以看到Tab.js组件中引入这个组件了,并且传递了一个回调函数到子组件,让子组件更改父组件的lIndex让父组件正确的显示那个组件。

接下来我们新建一个Headerbar.js组件:

import React, { Component } from 'react'

export default class Headerbar extends Component {
  render() {
    return (
      <div style={{background: "yellow", textAlign: "center", overflow: "hidden"}}>
        <button style={{float: "left"}}>back</button>
        <span>卖座电影</span>  
        <button style={{float: "right"}} onClick={() => {
          console.log(this.props.event)
          this.props.event()
        }}>center</button>
      </div>
    )
  }
}

可以看到点击center按钮触发了父组件的回调函数,父组件的回调函数就是将组件切换到我的组件:
在这里插入图片描述
但是底部子组件却有自己的状态不跟着父组件的状态,所以高亮显示不过去,那我们怎么让这个子组件不要有自己的状态,形成一个受控组件,跟随父组件的状态呢,将TabLi.js写成函数式组件:

// import React, { Component } from 'react'
import React from 'react'

export default function TabLi(props) {

    // function indexHandle(index){
    //     props.event(index)
    //     // 该通知父组件修改lIndex
    // }
    
  return (
    <div>
          <ul>
              {
                props.list.map((item, index) => 
                    <li onClick={() => props.event(index)} className={props.lIndex === index ? 'active' : ''} key={item.id}>{item.name}</li>
                )
              }
          </ul>
      </div>
  )

}


// export default class TabLi extends Component {
//   render() {
//     return (
//       <div>
//           <ul>
//               {
//                 this.props.list.map((item, index) => 
//                     <li onClick={() => {
//                         this.indexHandle(index)
//                     }} className={this.props.lIndex === index ? 'active' : ''} key={item.id}>{item.name}</li>
//                 )
//               }
//           </ul>
//       </div>
//     )
//   }
//   indexHandle(index) {
//     this.props.event(index)
//     // 该通知父组件修改lIndex
// }
// }

受控组件不要有自己的状态,全部通过父组件传过来的状态:
在这里插入图片描述
效果:
在这里插入图片描述
可以看到我们点击center按钮也跳到了我的组件,并且底部也高亮。

在学习React的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React 中,组件组件传递数据可以通过 props 属性来实现。组件可以通过 this.props 访问到传递过来的数据。 例如,我们有一个组件和一个组件: ```jsx // 组件 class ParentComponent extends React.Component { state = { message: 'Hello, World!' } render() { return ( <div> <ChildComponent message={this.state.message} /> </div> ) } } // 组件 class ChildComponent extends React.Component { render() { return ( <div> <h1>{this.props.message}</h1> </div> ) } } ``` 在组件中,我们将 message 作为 props 传递给组件。在组件中,我们可以通过 this.props.message 访问到传递过来的数据。 如果要实现组件组件传递数据,可以在组件中定义一个回调函数,将这个函数作为 props 传递给组件组件在需要向组件传递数据时,调用这个回调函数,并将数据作为参数传递给它。 例如,我们有一个组件和一个组件: ```jsx // 组件 class ParentComponent extends React.Component { state = { message: '' } handleMessage = (message) => { this.setState({ message }) } render() { return ( <div> <ChildComponent onMessage={this.handleMessage} /> <p>{this.state.message}</p> </div> ) } } // 组件 class ChildComponent extends React.Component { handleClick = () => { this.props.onMessage('Hello, World!') } render() { return ( <div> <button onClick={this.handleClick}>Click me!</button> </div> ) } } ``` 在组件中,我们定义了一个叫做 handleMessage 的回调函数,并将它作为 props 传递给组件。在组件中,我们定义了一个 handleClick 函数,当按钮被点击时调用这个函数,并将数据 'Hello, World!' 作为参数传递给组件的回调函数。 这样,组件就可以向组件传递数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值