我有以下两个组成部分:
import { findDOMNode } from 'react-dom';
class Items extends Component {
constructor(props) {
super(props);
this.ref = React.createRef();
this.selectedItemRef = React.createRef();
}
componentDidMount() {
if (this.props.selectedItem) {
this.scrollToItem();
}
}
componentWillReceiveProps(nextProps) {
if (this.props.selectedItem !== nextProps.selectedItem) {
this.scrollToItem();
}
}
scrollToItem() {
const itemsRef = this.ref.current;
const itemRef = findDOMNode(this.selectedItemRef.current);
// Do scroll stuff here
}
render() {
return (
<div ref={this.ref}>
{this.props.items.map((item, index) => {
const itemProps = {
onClick: () => this.props.setSelectedItem(item.id)
};
if (item.id === this.props.selectedItem) {
itemProps.ref = this.selectedItemRef;
}
return <Item {...itemProps} />;
})}
</div>
);
}
}
Items.propTypes = {
items: PropTypes.array,
selectedItem: PropTypes.number,
setSelectedItem: PropTypes.func
};
和
class Item extends Component {
render() {
return (
<div onClick={() => this.props.onClick()}>item</div>
);
}
}
Item.propTypes = {
onClick: PropTypes.func
};
在Items :: scrollToItem()中获取this.selectedItemRef
的DOM节点的正确方法是什么?
React docs不鼓励使用findDOMNode()
,但是还有其他方法吗?我应该在Item中创建引用吗?如果是这样,如何访问Items :: componentDidMount()中的引用?
谢谢
答案 0 :(得分:2)
我认为您想要的是current
,例如this.selectedItemRef.current
此页上的示例记录了该文件: https://reactjs.org/docs/refs-and-the-dom.html
为了安全起见,我还在js小提琴上进行了尝试,它可以按预期工作! https://jsfiddle.net/n5u2wwjg/195724/
如果您想获得React组件的DOM节点,我认为处理此问题的首选方法是让子组件完成繁重的工作。因此,例如,如果要在组件内部的输入上调用focus
,则可以让该组件设置ref并在该组件上调用方法,例如
this.myComponentRef.focusInput()
,然后componentRef将有一个名为focusInput
的方法,然后在输入上调用focus
。
如果您不想这样做,则可以使用findDOMNode进行破解,我想这就是为什么不鼓励这样做的原因!
(编辑,因为我在回答您后意识到已经了解current
,并想了解React组件。对此深表歉意!)