react 的 ref

136 阅读1分钟

ref 为字符串

直接写在jsx 的ref 上, 现在官方不再推荐这么写

class Sum extends React.Component{
  add = ()=>{
    let numA = this.refs.numA.value;
    let numB = this.refs.numB.value;
    let result = parseFloat(numA)+parseFloat(numB);
    this.refs.result.value = result;
  }
  render(){
    return (
      <>
       <input ref="numA"/>+<input ref="numB"/><button onClick={this.add}>=</button><input ref="result"/>
      </>
    )
  }
}

ref 为函数

class Sum extends React.Component{
  constructor(props){
    super(props);
  }
  add = ()=>{
    let numA = this.inputA.value;
    let numB = this.inputB.value;
    let result = parseFloat(numA)+parseFloat(numB);
    this.result.value = result;
  }
  render(){
    return (
      <>
       <input ref={(inputA) => this.inputA = inputA}/>+<input ref={(inputB) => this.inputB = inputB}/>
       <button onClick={this.add}>=</button><input ref={(result) => this.result = result}/>
      </>
    )
  }
}

createRef 实现原理

官方推荐这么写

如下所示, 在解析虚拟dom 时,会解析jsx转化的虚拟dom, 当解析到ref时, 会发现 ref 对应的 createRef{current: null} , 然后将真实dom挂载到current属性上

function createRef() {
    return {current: null}
}
class Sum3 extends React.Component{
  constructor(props){
    super(props);
    this.numA = createRef();//{current:numAInput}
    this.numB = createRef();//{current:numBInput}
    this.result = createRef();//{current:resultInput}
    // this.result = React.createRef();
  }
  add = ()=>{
    let numA = this.numA.current.value;
    let numB = this.numB.current.value;
    let result = parseFloat(numA)+parseFloat(numB);
    this.result.current.value = result;
  }
  render(){
    return (
      <>
       <input ref={this.numA}/>+<input ref={this.numB}/>
       <button onClick={this.add}>=</button><input ref={this.result}/>
      </>
    )
  }
}