🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

React:组合组件与传递属性

组件可以组合到一块儿去用。之前在 App 组件的显示里用了 h2 元素,现在我们把它单独定义成一个叫 Header 的组件。然后在 App 里用一下 Header 这个组件,这样 App 就是 Header 组件的爸爸(Parent),Header 是 App 的儿子(Child)。爸爸给儿子可以传递数据,儿子在显示的时候可以使用这些数据,传递的数据叫属性(Props)。在儿子那里可以通过 this.props 得到传递的属性的值。

App.js 改造成下面这样:

import React, { Component } from 'react'

class Header extends Component {
  render () {
    return (
      <h2 onClick={ () => this.props.changeHeader() }>
        { this.props.header }
      </h2>
    )
  }
}

class App extends Component {
  state = {
    header: 'ninghao.net'
  }

  changeHeader = () => {
    this.setState({
      header: '😄'
    })
  }

  render () {
    return (
      <Header changeHeader={ this.changeHeader } 
        header={ this.state.header } />
    )
  }
}

export default App

在 App 组件里,用了 Header 组件,用的时候 App 给 Header 传递了两件东西(Props),一个叫 changeHeader,还有一个是 header。在 Class 类型的组件里,可以用 this.props 访问到传递过来的属性。比如在 Header 组件里,可以用 this.props.changeHeader,还有 this.props.header 得到它爸爸也就是 App 组件传递过来的 changeHeader 还有 header 的值。

我们在 Header 组件的显示里的 h2 这个元素上,绑定了一个点击事件,发生事件,执行从它爸爸传递过来的 changeHeader 来处理事件。点击页面上显示的标题以后,会把标题变成一个 😄 表情。这个技巧以后经常会用到。儿子只管提出要求,具体执行全靠老爸。

事件对象

儿子:“爸,你看有人点我的标题(h2)了,用下你的 changeHeader ,你看着办吧。”,老爸:“好的,不过我可能需要事件对象(event),你把它给我传递过来。”

如果老爸那里的事件处理方法需要用到事件对象,在儿子那里使用的时候可以把 event 作为参数传递过去。

<h2 onClick={ (event) => this.props.changeHeader(event) }>
  { this.props.header }
</h2>

爸爸这里,可以在事件处理里面添加 event 参数:

  changeHeader = (event) => {
    this.setState({
      header: '😄'
    })
    console.log(event)
  }

其它参数

儿子在用它老爸那里传递过来的事件处理的时候,除了可以传递 event 对象,也可以传递额外的参数。

像这样改造一下 Header 组件:

class Header extends Component {
  state = {
    emoji: '👪'
  }

  render () {
    return (
      <h2 onClick={ (event) => 
        this.props.changeHeader(event, this.state.emoji) }>
        { this.props.header }
      </h2>
    )
  }
}

再去改造一下老爸那里的事件处理:

  changeHeader = (event, emoji) => {
    this.setState({
      header: emoji
    })
    console.log(event, emoji)
  }

现在,点击了 Header 组件里的标题元素,会触发执行它老爸那里的 changeHeader 去修改标题。标题的内容会是 Header 里的 emoji 这个 state 的值。

现在的 App.js 整体是这样的:

import React, { Component } from 'react'

class Header extends Component {
  state = {
    emoji: '👪'
  }

  render () {
    return (
      <h2 onClick={ (event) => 
        this.props.changeHeader(event, this.state.emoji) }>
        { this.props.header }
      </h2>
    )
  }
}

class App extends Component {
  state = {
    header: 'ninghao.net'
  }

  changeHeader = (event, emoji) => {
    this.setState({
      header: emoji
    })
    console.log(event, emoji)
  }

  render () {
    return (
      <Header changeHeader={ this.changeHeader } 
        header={ this.state.header } />
    )
  }
}

export default App
React
微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点