指定displayName以响应静态组件

时间:2018-04-19 04:05:02

标签: javascript reactjs ecmascript-6

如何为Title组件命名?我在它下面尝试了Title.displayName我收到了一个错误。

class Menu extends Component {
  static Title = ({ children, handleTabClick }) => {
    return (
      <div className="title" onClick={handleTabClick}>
        {children}
      </div>
    );
  };
  //Title.displayName = 'title' //won't work

  render() {
    return React.Children.map(this.props.children, child =>
      React.cloneElement(child)
    )
  }
}

除非我在课外宣布标题,否则我不知道如何给它起名字。

1 个答案:

答案 0 :(得分:1)

函数namedisplayName属性用于调试目的,并非必要。通常可以忽略它们而不是更精简的代码。

如果需要name,可以是:

class Menu extends Component {
  static Title = function Title({ children, handleTabClick }) {
    return (
      <div className="title" onClick={handleTabClick}>
        {children}
      </div>
    );
  };
  ...

或者只是:

class Menu extends Component {
  static Title({ children, handleTabClick }) {
    return (
      <div className="title" onClick={handleTabClick}>
        {children}
      </div>
    );
  }
  ...

name足以进行调试,displayName is non-standard默认情况下并不在大多数浏览器中使用。

可以通过装饰器方便地将属性分配给静态方法(如果这是实例方法,它的分配方式可能会有所不同):

function displayName(name) {
  return (target, prop, descriptor) => { 
    target[prop].displayName = name;
  };
}

class Menu extends Component {
  @displayName('Title')
  static Title({ children, handleTabClick }) {
    return (
      <div className="title" onClick={handleTabClick}>
        {children}
      </div>
    );
  }
  ...