组件的pros

2017-07-25  本文已影响52人  SamDing

前面文章提到一个React工程中包含很多Component,可以通过向组件中传递参数,及props,使得组件更灵活的被复用。
例如以下代码:

class LikeButton extends Component {
  constructor () {
    super()
    this.state = { isLiked: false }
  }

  handleClickOnLikeButton () {
    this.setState({
      isLiked: !this.state.isLiked
    })
  }

  render () {
    const likedText = this.props.likedText || '取消'
    const unlikedText = this.props.unlikedText || '点赞'
    return (
      <button onClick={this.handleClickOnLikeButton.bind(this)}>
        {this.state.isLiked ? likedText : unlikedText} 
      </button>
    )
  }
}

class Index extends Component {
  render () {
    return (
      <div>
        <LikeButton likedText='已赞' unlikedText='赞' />
      </div>
    )
  }
}

在使用一个组件时,可以把参数放在标签的属性当中,所有的属性都会作为props对象的键值。可以把任意类型的数据作为参数,包括字符串、数字、对象、甚至是函数。例如,可以把一个对象传给组件LikeButton:

class Index extends Component {
  render () {
    return (
      <div>
        <LikeButton wordings={{likedText: '已赞', unlikedText: '赞'}} />
      </div>
    )
  }
}

JSX 的 {} 内可以嵌入任何表达式,{{}} 就是在 {} 内部用对象字面量返回一个对象而已,并不是什么新语法。
还可以往组件中传入函数作为参数:

class Index extends Component {
  render () {
    return (
      <div>
        <LikeButton
          wordings={{likedText: '已赞', unlikedText: '赞'}}
          onClick={() => console.log('Click on like button!')}/>
      </div>
    )
  }
}

通过this.props.onClick获取到这个传入的函数,修改LikeButton中的handleClickOnLikeButton方法:

  handleClickOnLikeButton () {
    this.setState({
      isLiked: !this.state.isLiked
    })
    if (this.props.onClick) {
      this.props.onClick()
    }
  }

默认配置 defaultProps


React.js提供一种法师defaultProp,可以设置一个Component的默认配置:

class LikeButton extends Component {
  static defaultProps = {
    likedText: '取消',
    unlikedText: '点赞'
  }

  constructor () {
    super()
    this.state = { isLiked: false }
  }

  handleClickOnLikeButton () {
    this.setState({
      isLiked: !this.state.isLiked
    })
  }

  render () {
    return (
      <button onClick={this.handleClickOnLikeButton.bind(this)}>
        {this.state.isLiked
          ? this.props.likedText
          : this.props.unlikedText} 
      </button>
    )
  }
}

props不可变


你不能在一个组件中修改props对应的属性值,它是readonly的,只能通过父级来修改传入的参数。

  handleClickOnLikeButton () {
    this.props.likedText = '取消'//不可以,这样会报错
    this.setState({
      isLiked: !this.state.isLiked
    })
  }

总结


上一篇 下一篇

猜你喜欢

热点阅读