React,在组件中获取绑定的父 dom 元素名称
React, get bound parent dom element name within component
在我的组件中,如何访问嵌套在其中的父组件的名称?
所以如果我的渲染是这样的:
ReactDOM.render(
<RadialsDisplay data={imagedata}/>,
document.getElementById('radials-1')
);
如何从组件本身中检索 id
名称 #radials-1
?
将它作为 属性 传递可能最有意义,但如果您 真的 需要以编程方式获取它,并且从 内部组件,你可以等待组件挂载,找到它的DOM节点,然后查看它的父节点。
这是一个例子:
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"));
工作演示:https://jsbin.com/yayepa/1/edit?html,js,output
如果你经常这样做,或者想要真正花哨,你可以利用高阶组件:
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>
}
这里,withContainerId
是一个函数,它接受一个名为 property
的参数,returns 是一个新函数。此函数可以将组件类型作为其唯一参数,并且 returns 是高阶组件。渲染时,新组件将渲染 passed 组件及其所有原始道具,以及一个附加道具,用于指定 属性 上由 [=14] 指定的父容器 ID =] 参数。
如果您愿意,您可以将它们与 ES7 装饰器(当前实现的)一起使用,或者通过常规函数调用:
@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"));
在我的组件中,如何访问嵌套在其中的父组件的名称?
所以如果我的渲染是这样的:
ReactDOM.render(
<RadialsDisplay data={imagedata}/>,
document.getElementById('radials-1')
);
如何从组件本身中检索 id
名称 #radials-1
?
将它作为 属性 传递可能最有意义,但如果您 真的 需要以编程方式获取它,并且从 内部组件,你可以等待组件挂载,找到它的DOM节点,然后查看它的父节点。
这是一个例子:
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"));
工作演示:https://jsbin.com/yayepa/1/edit?html,js,output
如果你经常这样做,或者想要真正花哨,你可以利用高阶组件:
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>
}
这里,withContainerId
是一个函数,它接受一个名为 property
的参数,returns 是一个新函数。此函数可以将组件类型作为其唯一参数,并且 returns 是高阶组件。渲染时,新组件将渲染 passed 组件及其所有原始道具,以及一个附加道具,用于指定 属性 上由 [=14] 指定的父容器 ID =] 参数。
如果您愿意,您可以将它们与 ES7 装饰器(当前实现的)一起使用,或者通过常规函数调用:
@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"));