使用在v0.13.0中引入的React.findDOMNode
方法,我可以通过映射this.props.children
获取传递给父组件的每个子组件的DOM节点。
但是,如果某些子组件是React元素而不是组件(例如,通过JSX创建的<div>
),则React会抛出不变式违规错误。
无论子类是什么类,有没有一种方法在挂载后获取每个子组件的正确DOM节点?
使用在v0.13.0中引入的React.findDOMNode
方法,我可以通过映射this.props.children
获取传递给父组件的每个子组件的DOM节点。
但是,如果某些子组件是React元素而不是组件(例如,通过JSX创建的<div>
),则React会抛出不变式违规错误。
无论子类是什么类,有没有一种方法在挂载后获取每个子组件的正确DOM节点?
this.props.children
应该是一个 ReactElement 或者一个包含 ReactElement 的数组,而不是组件。
如果想获取子元素的 DOM 节点,你需要先克隆它们并为其分配新的 ref。
render() {
return (
<div>
{React.Children.map(this.props.children, (element, idx) => {
return React.cloneElement(element, { ref: idx });
})}
</div>
);
}
你可以通过this.refs[childIdx]
访问子组件,通过ReactDOM.findDOMNode(this.refs[childIdx])
检索它们的DOM节点。
ref
属性即可直接访问该元素。<input type="text" ref="myinput">
然后您可以直接:
componentDidMount: function()
{
this.refs.myinput.select();
},
如果您已经为任何元素添加了ref
,则无需使用ReactDOM.findDOMNode()
。
通过使用“refs”属性可能可以实现这一点。
以想要到达一个<div>
为例,你需要使用的是<div ref="myExample">
。然后,您就可以使用React.findDOMNode(this.refs.myExample)
获取该DOM节点。
从那里开始,获取每个子元素的正确DOM节点可能只需要映射this.refs.myExample.children
(我还没有测试),但您至少可以通过使用ref属性来抓取任何特定的挂载子节点。
有关更多信息,请参见官方react关于refs的文档。
ReactDom.findDOMNode(..)
。 - Ben Windingfunction ChildComponent({ childRef }) {
return <div ref={childRef} />;
}
class Parent extends React.Component {
myRef = React.createRef();
get doSomethingWithChildRef() {
console.log(this.myRef); // Will access child DOM node.
}
render() {
return <ChildComponent childRef={this.myRef} />;
}
}
React.findDOMNode(this.refs.myExample)
在另一个答案中提到已被弃用。
请使用'react-dom'
中的ReactDOM.findDOMNode
代替。
import ReactDOM from 'react-dom'
let myExample = ReactDOM.findDOMNode(this.refs.myExample)
class Container extends React.Component {
constructor(props) {
super(props)
this.setRef = this.setRef.bind(this)
}
setRef(node) {
this.childRef = node
}
render() {
return <Child setRef={ this.setRef }/>
}
}
const Child = ({ setRef }) => (
<div ref={ setRef }>
</div>
)
class Container extends React.Component {
constructor(props) {
super(props)
this.state = {
modalOpen: false
}
this.open = this.open.bind(this)
this.close = this.close.bind(this)
this.setModal = this.setModal.bind(this)
}
open() {
this.setState({ open: true })
}
close(event) {
if (!this.modal.contains(event.target)) {
this.setState({ open: false })
}
}
setModal(node) {
this.modal = node
}
render() {
let { modalOpen } = this.state
return (
<div>
<button onClick={ this.open }>Open</button>
{
modalOpen ? <Modal close={ this.close } setModal={ this.setModal }/> : null
}
</div>
)
}
}
const Modal = ({ close, setModal }) => (
<div className='modal' onClick={ close }>
<div className='modal-window' ref={ setModal }>
</div>
</div>
)
this
,而不是在构造函数中执行。)作为后续,我发现另一种获得子引用的方法,我在下面记录为解决方案。 - Lauren
ref
吗?换句话说,如果您的子组件是<div ref="a" />
,那么这不会破坏对refs.a
的任何引用,因为它被覆盖为idx
吗? - Aaron Beall{ ref: node => this.node = node; element.ref(node); }
- Alexandre KirszenbergcomponentDidMount() {
let hoc的最外层DOM节点 = ReactDOM.findDOMNode(this))
}
- basilthis.props.children
可能包含纯文本节点(在设计可包装任何有效jsx的灵活的 <Tooltip> 组件时,我有时会这样做)。这将导致在React.cloneElement(element)
中出现错误。因此,最好检查React.isValidElement(element)
和/或typeof element === 'string'
。 - V. Rubinetti