Skip to content
// 操作原生DOM的2种方式

import { useRef, forwardRef } from "react"

const Child = forwardRef((props, ref) => {
  return (
    <div>
      我是head组件
      <input type="text" ref={ref} />
    </div>
  )
})

const Parent = () => {
  const myRef = useRef()
  
  const handleClick = () => {
    myRef.current.focus()
  }

  return (
    <div>
      <button onClick={handleClick}>获取input</button>
      <Child ref={myRef} />
    </div>
  )
}

const UseRefCom = () => {

  const myRef = useRef()

  let inputRef = ''

  const handleGetInput = () => {
    inputRef.focus()
  }

  // 方式一、通过回调函数
  const elementFn = (elem) => {
    inputRef = elem
    console.log(elem)
  }

  // 方式二、通过useRef
  const handleGetInput2 = () => {
    myRef.current.focus()
  }

  // 特性:forwardRef
  // 可以把ref暴露给父组件,让父组件可以操作子组件的DOM

  // 特性:useRef里也可以传值
  // 用于存储一些和渲染无关的数据
  // const someValue = useRef(0)

  /**
   * 
   * 
   * 
  let Welcome = (props) => {  
    const [num, setNum] = useState(0);
    let isUpdate = useRef(false);
    useEffect(()=>{
        if(isUpdate.current){
            console.log(123);
        }
    })
    const handleClick = () => {
        setNum(num + 1)
        isUpdate.current = true;
    }
    return (
        <div>
            <button onClick={handleClick}>点击</button>
        </div>
    );
}
   */

  return (
    <div>
      <h3>方式一:</h3>
      <button onClick={handleGetInput}>获取Input</button>
      <input ref={elementFn} type="text" />
      <hr />
      <h3>方式二:</h3>
      <button onClick={handleGetInput2}>获取Input</button>
      <input ref={myRef} type="text" />
      <hr />
      <h3>通过forwardRef把子组件里的DOM暴露给父组件</h3>
      <Parent />
    </div>
  )
}

export default UseRefCom