React, get bound parent dom element name within component

后端 未结 1 1572
悲&欢浪女
悲&欢浪女 2021-02-02 09:56

Within my component, how can I access the name of the parent component it is nested inside?

So if my render is thus:

ReactDOM.render(
      

        
相关标签:
1条回答
  • 2021-02-02 10:16

    It probably makes the most sense to pass it as a property, but if you really need to get it programmatically, and from inside the component, you can wait for the component to mount, find its DOM node, and then look at its parent.

    Here's an example:

    class Application extends React.Component {
      constructor() {
        super();
        this.state = { containerId: "" };
      }
    
      componentDidMount() {
        this.setState({
          containerId: ReactDOM.findDOMNode(this).parentNode.getAttribute("id")
        });
      }
    
      render() {
        return <div>My container's ID is: {this.state.containerId}</div>;
      }
    }
    
    ReactDOM.render(<Application />, document.getElementById("react-app-container"));
    

    Working demo: https://jsbin.com/yayepa/1/edit?html,js,output


    If you do this a lot, or want to be really fancy, you could utilize a higher-order component:

    class ContainerIdDetector extends React.Component {
      constructor() {
        super();
        this.state = { containerId: "" };
      }
    
      componentDidMount() {
        this.setState({
          containerId: ReactDOM.findDOMNode(this).parentNode.getAttribute("id")
        });
      }
    
      render() {
        if (!this.state.containerId) {
          return <span />;
        } else {
          return React.cloneElement(
            React.Children.only(this.props.children),
            { [this.props.property]: this.state.containerId }
          );
        }
      }
    }
    
    ContainerIdDetector.propTypes = {
      property: React.PropTypes.string.isRequired
    }
    
    // Takes an optional property name `property` and returns a function. This
    // returned function takes a component class and returns a new one
    // that, when rendered, automatically receives the ID of its parent
    // DOM node on the property identified by `property`.
    function withContainerId(property = "containerId") {
      return (Component) => (props) =>
        <ContainerIdDetector property={property}>
          <Component {...props} />
        </ContainerIdDetector>
    }
    

    Here, withContainerId is a function that takes an argument called property and returns a new function. This function can take a component type as its only argument, and returns a higher-order component. When rendered, the new component will render the passed component, with all its original props, plus an additional prop specifying the parent container's ID on the property specified by the property argument.

    You can use them with ES7 decorators (as currently implemented) if you wish, or via a regular function call:

    @withContainerId()
    class Application extends React.Component {
      render() {
        return <div>My containers ID is: {this.props.containerId}</div>;
      }
    }
    
    // or, if you don't use decorators:
    //
    // Application = withContainerId()(Application);
    
    ReactDOM.render(<Application />, document.getElementById("react-app-container"));
    

    Working demo: https://jsbin.com/zozumi/edit?html,js,output

    0 讨论(0)
提交回复
热议问题