具有功能的React组件

时间:2017-02-07 15:31:05

标签: javascript reactjs ecmascript-6 react-jsx jsx

我有一个带有一些div的反应类,我想从函数中添加一些额外的HTML。

当我运行此操作时,我收到一条错误消息,指出未定义OverlayButton。我的灵感来自HERE

我知道我可以在一个单独的类中拆分OverlayButton,但它只是一个没有逻辑的哑按钮。

export default class Widget extends React.Component {

  OverlayButton(props) {
     return (
      <div
        className={props.className}
        onClick={props.handler}
        ref='select'>
          <i className="material-icons">
            {props.icon}
          </i>
      </div>
      )
  }

  render() {
    return (
      <div>
        <div className="photo-widget-content"></div>
          <div className="photo-widget-header"></div>
            <img src={this.props.photo.url}></img>
            return <OverlayButton icon="check" handler="" className=""/>
      </div>
      );
  }
}

2 个答案:

答案 0 :(得分:3)

您几乎就在那里,只需将 <OverlayButton ... /> 替换为 <this.OverlayButton ... />

严格来说,在回答其他答案(也是正确的)时,不需要将其称为函数,因为您可以依靠JSX为您完成。

Here一个例子。

class Widget extends React.Component {

  OverlayButton(props) {
     return (
       <div>
         Button
       </div>
     );
  }

  render() {
    return (
      <div>
       <this.OverlayButton />
      </div>
    );
  }
}

ReactDOM.render(
  <Widget />,
  document.getElementById('container')
);

据说,我可能不会将OverlayButton定义为类的实例方法,而是将其移到类的顶部并简单地将其定义为一个函数......像这样:

const OverlayButton = (props)=> {
  return (
    <div>
      Button
    </div>
  );
}

然后

class Widget extends React.Component { 
   ...

   render() {
     return <OverlayButton ... />
   } 
}

答案 1 :(得分:2)

如果你想使用OverlayButton作为函数(方法),你需要在{}括号内调用它:

export default class Widget extends React.Component {

  OverlayButton(props) {
     return (
      <div
        className={props.className}
        onClick={props.handler}
        ref='select'>
          <i className="material-icons">
            {props.icon}
          </i>
      </div>
      )
  }

  render() {
    return (
      <div>
        <div className="photo-widget-content"></div>
          <div className="photo-widget-header"></div>
          <img src={this.props.photo.url} />
          {this.OverlayButton({
            icon: 'check',
            handler: function() {},
            className: ''
          })}
      </div>
      );
  }
}