Ref的作用

在React与vue中都有ref,通常我们在表单类组件是用。具体而言,作用可分两类

  • 标记dom,获取dom实例
  • 标记子组件,获取子组件实例,从而直接获取到子组件的一切信息(子传父的一种方案)

Ref使用方式的演变

最早期,ref=’string’

  1. //标记dom
  2. import React form 'react';
  3. class C extends React.Component{
  4. state = {
  5. a:1
  6. }
  7. render(){
  8. return <div>child</div>
  9. }
  10. }
  11. export default class extends React.Component{
  12. componentDidMount(){
  13. // 只有在初始化render之后,才能拿到实例
  14. console.log(this.refs);
  15. }
  16. render(){
  17. return (
  18. <div ref='box'>
  19. <C ref='child'/>
  20. </div>
  21. )
  22. }
  23. }

目前版本仍然可以这样使用,但是会报warning,所以不建议再这么用了,这种使用方式马上会被弃用
注意ref不能标记function组件

中期改版 用callback的方式标记,更安全

  1. import React form 'react';
  2. class C extends React.Component{
  3. state = {
  4. a:1
  5. }
  6. render(){
  7. return <div>child</div>
  8. }
  9. }
  10. export default class extends React.Component{
  11. componentDidMount(){
  12. // 只有在初始化render之后,才能拿到实例
  13. console.log(1,this.boxRef);
  14. console.log(2,this.childRef);
  15. }
  16. render(){
  17. return (
  18. <div ref={ ref=>this.boxRef = ref } >
  19. <C ref={ ref=>this.childRef = ref }/>
  20. </div>
  21. )
  22. }
  23. }

目前这种方式还是被大量使用的,也不会报warning

react16.3版本后,我们可以用最新的方式

  1. import React form 'react';
  2. class C extends React.Component{
  3. state = {
  4. a:1
  5. }
  6. render(){
  7. return <div>child</div>
  8. }
  9. }
  10. export default class extends React.Component{
  11. boxRef = React.createRef()
  12. childRef = React.createRef()
  13. componentDidMount(){
  14. // 只有在初始化render之后,才能拿到实例
  15. console.log(this.boxRef);
  16. console.log(this.childRef);
  17. }
  18. render(){
  19. return (
  20. <div ref={ this.boxRef } >
  21. <C ref={this.childRef }/>
  22. </div>
  23. )
  24. }
  25. }

使用这种方式,是完美的