• 使用refs而不是findDOMNode()去获取DOM节点.
    • 使用this找到DOM节点
      • 以前的做法:
      • 使用ref之后的做法
    • 使用字符串ref找到DOM节点
      • 使用字符串ref的做法
      • 使用回调ref的做法
    • 调用子组件的ref
      • 不使用ref的做法:
      • 使用ref的做法
  • 参考资料:

    使用refs而不是findDOMNode()去获取DOM节点.

    注意:
    React实际上也支持使用字符串作为ref, 来访问DOM节点. 但是需要注意的是这是一种已经不被官方推荐的用法.

    • 更多关于ref的知识
    • 为什么字符串形式的ref已经不被推荐了?
    使用this找到DOM节点
    以前的做法:
    1. class MyComponent extends Component {
    2. componentDidMount() {
    3. findDOMNode(this).scrollIntoView();
    4. }
    5. render() {
    6. return <div />
    7. }
    8. }
    使用ref之后的做法
    1. class MyComponent extends Component {
    2. componentDidMount() {
    3. this.node.scrollIntoView();
    4. }
    5. render() {
    6. return <div ref={node => this.node = node}/>
    7. }
    8. }
    使用字符串ref找到DOM节点
    使用字符串ref的做法
    1. class MyComponent extends Component {
    2. componentDidMount() {
    3. findDOMNode(this.refs.something).scrollIntoView();
    4. }
    5. render() {
    6. return (
    7. <div>
    8. <div ref='something'/>
    9. </div>
    10. )
    11. }
    12. }
    使用回调ref的做法
    1. class MyComponent extends Component {
    2. componentDidMount() {
    3. this.something.scrollIntoView();
    4. }
    5. render() {
    6. return (
    7. <div>
    8. <div ref={node => this.something = node}/>
    9. </div>
    10. )
    11. }
    12. }
    调用子组件的ref
    不使用ref的做法:
    1. class Field extends Component {
    2. render() {
    3. return <input type='text'/>
    4. }
    5. }
    6. class MyComponent extends Component {
    7. componentDidMount() {
    8. findDOMNode(this.refs.myInput).focus();
    9. }
    10. render() {
    11. return (
    12. <div>
    13. Hello,
    14. <Field ref='myInput'/>
    15. </div>
    16. )
    17. }
    18. }
    使用ref的做法
    1. class Field extends Component {
    2. render() {
    3. return (
    4. <input type='text' ref={this.props.inputRef}/>
    5. )
    6. }
    7. }
    8. class MyComponent extends Component {
    9. componentDidMount() {
    10. this.inputNode.focus();
    11. }
    12. render() {
    13. return (
    14. <div>
    15. Hello,
    16. <Field inputRef={node => this.inputNode = node}/>
    17. </div>
    18. )
    19. }
    20. }

    参考资料:

    • ESLint Rule proposal: warn against using findDOMNode()
    • Refs and the DOM