基本使用
某些情况下,我们需要获取组件的实例,或者 react 元素的 Dom 节点,,这个时候就得用到 ref,关于 ref 的基本使用方法有两种:
this.ref=createRef() 
<ReactDom ref={(ref)=>{this.ref=ref }}/> 
基本使用 : https://zh-hans.reactjs.org/docs/refs-and-the-dom.html
项目中的使用
最近在做的项目的时候,遇到一个需求.十几个输入框或者选择框组成一个表单域,然后整体对这个”表单域”进行增加.正常思维就是把这个”表单域”封装为一个组件,我就起名为了 SchemeForm ,然后组件内就声明一个方法获取数据 ,就叫getFormData(),类的结构大致如下:
1 2 3 4 5 6 7 8 9
   | class SchemeForm  extends component {     getFormData(){              }
      render(){         ...     } }
 
  | 
 
App.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
   | import React from 'react';
  class App extends React.Component {   state = {     data: [{ name: 'aa' }],   };
    formRefs = [];
    getFormData() {        }
    add = () => {     this.formRefs = [];     this.setState({       data: data.concat({ name: 'bbb' }),     });   };
    getRef(refs, item) {     console.log('执行...', refs, item);
      if (refs) {       this.formRefs.push(refs);     }   }   
 
 
 
    render() {     const { data } = this.state;          this.formRefs = [];     return (       <div>         {data.map((item, index) => (           <SchemeForm             key={index}             ref={ref => {               console.log(ref, item);               if (ref) {                 this.formRefs.push(ref);               }             }}           />         ))}         <button onClick={this.add}>+</button>       </div>     );   } }
 
  | 
 
日志输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
   | 初入渲染:   输出 (组件的ref,{name:'aa'}) 点击+按钮:   输出 (null,{name:'aa'})   输出 (组件的ref,{name:'aa'})   输出 (组件的ref,{name:'bb'}) 再次点击:   输出 (null,{name:'aa'})   输出 (null,{name:'bb'})   输出 (组件的ref,{name:'aa'})   输出 (组件的ref,{name:'bb'})   输出 (组件的ref,{name:'bb'})
 
 
  | 
 
经过观察,里面的回调函数,会执行上一次 render 里面 ref 绑定的回调函数.是在怪哉,不明,但终归动态的获取到了组件的 ref 数组
收获
经过折腾得知,ref 里面的回调函数,是在 render 函数之后才执行的,在 componentDidMount 和 compnentDidUpdate 可以获取得到 。ref的用法,在项目中也经常可见,如,在最APP中根元素,放置一个Modal组件,然后把ref保持出来存在一个类中,这样,我们就可以在项目其它地方可以调用 ref.show(config),把模态框展现出来。