如何使用React.createRef()API从类组件引用中获取DOM节点

时间:2018-09-20 11:03:20

标签: reactjs react-dom

我有以下两个组成部分:

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()中的引用?

谢谢

1 个答案:

答案 0 :(得分:2)

我认为您想要的是current,例如this.selectedItemRef.current

此页上的示例记录了该文件: https://reactjs.org/docs/refs-and-the-dom.html

enter image description here

为了安全起见,我还在js小提琴上进行了尝试,它可以按预期工作! https://jsfiddle.net/n5u2wwjg/195724/

如果您想获得React组件的DOM节点,我认为处理此问题的首选方法是让子组件完成繁重的工作。因此,例如,如果要在组件内部的输入上调用focus,则可以让该组件设置ref并在该组件上调用方法,例如

this.myComponentRef.focusInput()

,然后componentRef将有一个名为focusInput的方法,然后在输入上调用focus

如果您不想这样做,则可以使用findDOMNode进行破解,我想这就是为什么不鼓励这样做的原因!

(编辑,因为我在回答您后意识到已经了解current,并想了解React组件。对此深表歉意!)