在React中获取组件名称

Vin*_*NOL 19 reactjs

我正在开发一个React应用程序.我有一个Loading组件,这是一个等待的动画.我想根据调用它的组件在此Loading组件中添加一条消息.

这是我如何调用我的Loading组件(this.state.displayLoading为true或false):

class LoginForm extends React.Component {
    render() {   
        return (
            <div className="login-form-root">
                 {this.state.displayLoading && <Loading loadingFrom={?}/>}
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在我的变量loadingFrom中获取"LoginForm",这是className.也许这不是正确的方法.

Con*_*kos 24

您可以使用this.constructor.name获取组件的名称.

(在撰写本文时使用React 16.x)

警告:如果您正在使用Webpack缩小生产,这将无效.

  • 它可以与 webpack 一起使用,您只需在生产配置的“uglify”选项中将“keep_fnames”和“keep_classnames”设置为“true”:https://github.com/LemonPi/issues_webpack_classname (3认同)
  • 好吧,React 现在允许函数组件,它们不是类,因此没有 `this.constructor.name`。然而,从[文档](https://reactjs.org/docs/react-component.html#displayname)看来,“displayName”是“React.Component”类的官方属性,我相信“displayName” ` 也会在函数组件上自动设置。 (2认同)

Ice*_*kle 21

每个React.Component都有一个名为displayNameJSX自动设置的属性,所以理论上你可以使用该属性

class LoginForm extends React.Component {
    render() {   
        return (
            <div className="login-form-root">
                {this.state.displayLoading && <Loading loadingFrom={this.displayName}/>}
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

更新 (多条评论说它不起作用)

根据惯例,react提供了一个代码片段来包装获取其文档的组件名称,如下所示:

function withSubscription(WrappedComponent) {
  class WithSubscription extends React.Component {/* ... */}
  WithSubscription.displayName = `WithSubscription(${getDisplayName(WrappedComponent)})`;
  return WithSubscription;
}

function getDisplayName(WrappedComponent) {
  return WrappedComponent.displayName || WrappedComponent.name || 'Component';
}
Run Code Online (Sandbox Code Playgroud)

可以看出,他们首先检查显示名称,然后检查组件名称,如果全部失败,那么它将是公正的 'Component'

  • 我得到该属性的“未定义”。 (2认同)
  • @MrColes我用文档网站上的更多信息更新了帖子,请注意,即使React也不是真正使用一种标准方式,但是我添加了参考网站本身的代码以获取更多信息。 (2认同)

Shu*_*tri -4

您不需要它是动态的,因为您自己编写组件并且可以将其作为字符串传递

class LoginForm extends React.Component {
    render() {   
        return (
            <div className="login-form-root">
                 {this.state.displayLoading && <Loading loadingFrom="LoginForm "/>}
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您仍然需要访问组件的名称,您可以displayName在组件上定义属性

class LoginForm extends React.Component {
   static displayName = 'LoginForm';
    render() {   
        return (
            <div className="login-form-root">
                 {this.state.displayLoading && <Loading loadingFrom="LoginForm "/>}
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样访问它Component.displayName