如何在不向其父元素/子元素添加逻辑的情况下获取组件中子元素的dom节点
How do I get the dom node of a child element in a component without adding logic to its parent/children?
在以下示例中,WrapperComp
需要访问第5行和第8行中divs
的dom节点,而无需向PageComp
或ItemComp
添加逻辑。我在PageComp
中唯一可以更改的就是div标记。例如,我可以向它们添加ref
、prop
、data-attribute
等。
divs
不必在PageComp
内部创建。WrapperComp
也可以创建它们,但它们必须包装它的每个子级(在这种情况下,每个ItemComp
)。
示例
class PageComp extends React.Component {
render() {
return (
<WrapperComp>
<div>
<ItemComp/>
</div>
<div>
<ItemComp/>
</div>
</WrapperComp>
);
}
}
class WrapperComp extends React.Component {
render() {
return (
<div>
<h1>A wrapper</h1>
{this.props.children}
</div>
);
}
}
class ItemComp extends React.Component {
render() {
return (
<div>
<h1>An item</h1>
</div>
);
}
}
ReactDOM.render(
<PageComp/>,
document.getElementById('app')
);
JSBIN
到目前为止我尝试了什么:
- 我已经尝试在
divs
上放置ref=
,但ref
只能在PageComp
中使用,而不能在WrapperComp
中使用 - 我还试图在
WrapperComp
中创建divs
,并从那里在它们上放置ref=
,但这会导致Refs必须具有所有者警告
现在我想。。解决这个问题的合适方法是什么?
到目前为止,我想到的唯一解决方案是在每个div
上放一个data-attribute
,并在componentDidMount
之后的dom中搜索它们,就像这样:document.querySelectorAll('[data-xxx]')
。也许我不确定你是不是这样做的。。
为什么我想在WrapperComp
中获取节点?
我想创建一个组件来调整其子级的尺寸。在该示例中,该组件将是WrapperComp
。只有在子级渲染到dom之后才能进行调整,例如获得clientHeight
。
如果你不限制这需要通过如何获得DOM、传递它们等来解决,我会摆脱这个难题,从不同的方向来解决它。
由于你对<PageComp>
没有太多的控制权,而<WrapperComp>
似乎很灵活,我会在后面通过将传递的孩子转化为你需要的样子来完成包装。
class PageComp extends React.Component {
render() {
return (
<WrapperComp>
<ItemComp/>
<ItemComp/>
</WrapperComp>
);
}
}
class WrapperComp extends React.Component {
render() {
const wrappedChldren = React.Children.map(this.props.children, function(child) {
return (
<div ref={function(div) {
this.setState{clientHeight: div.clientHeight}
}}>
<h1>A wrapper</h1>
{ child }
</div>
);
});
return <div>{ wrappedChildren }</div>;
}
}
有了这个浓缩物,就可以在<WrapperComp>
中进行转换,顾名思义,这是非常直观的。
相关文章:
- React - 从 DOM 元素获取组件以进行调试
- 如何使用 JQuery 从相对元素获取 html 文本
- 从同一域上的 iframe 中的元素获取值
- 使用本机 Javascript 从 DOM 元素获取选择器字符串
- 使用jquery从另一个元素获取使用id的输入的id
- 如何从角度元素获取编译的节点值
- 如何为不同的元素获取不同的父类
- 从 jQuery 中的子元素获取父 tr 元素
- 当浮点部分为空时,从 JQuery 中的输入元素获取数字值不起作用
- 从 XML 元素获取文本
- 从音频元素获取音频样本
- 从所选元素 html 上方的元素获取属性值
- 使用 jQuery.data 从 dom 元素获取布尔值
- 如何通过jquery从某个元素获取部分文本
- 从输入元素获取表单和表单数据对象
- 从动态元素获取挖空视图的大小
- 从中继器循环中显示的子自定义元素获取正确的上下文.奥蕾莉亚
- 如何使用 JavaScript 或 JQuery 从输入类型=文件 html 元素获取文件名
- 从父元素获取 ID 并将它们放在数组中
- 尝试从选项元素获取 HTML