美文网首页react-native-导航
useRef、useImperativeHandle

useRef、useImperativeHandle

作者: 一土二月鸟 | 来源:发表于2020-08-14 11:51 被阅读0次
  • useRef可以直接获取dom元素
import React from 'react';
import ReactDOM from 'react-dom';
import { useRef, useState } from 'react';

const App = () => {

  const inputRef = useRef();
  
  const clickClear = () => {
    inputRef.current.value = '';
  }

  return (
    <>
      <input ref={inputRef}/>
      <br />
      <button onClick={clickClear}>清空输入框</button>
    </>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));
  • useRef结合useImperativeHandle可以通过父组件获取子组件的方法
import React, { useImperativeHandle, useRef, forwardRef } from "react";
import ReactDom from 'react-dom';

const Child = (props, ref) => {
  useImperativeHandle(ref, () => ({
    test: () => {
      console.log("i am child's test method");
    },
  }));

  return <div> i am test's child </div>;
};

const Index = () => {
  const ref = useRef();
  const FChild = forwardRef(Child);

  const clickBtn = () => {
    ref.current.test();
  };

  return (
    <div>
      <button onClick={clickBtn}> click me </button>
      <FChild ref={ref}></FChild>
    </div>
  );
};

ReactDom.render( <Index />, document.getElementById('root') );
  • 通过useRef和forwardRef获取子组件的特定元素
  • 此方式不推荐使用,违反了封装的设计原则,耦合性过高
import React, { useRef, forwardRef } from "react";
import ReactDOM from 'react-dom'

const Child = (props, ref) => {
  return <input ref={ref}/>;
};

const Index =  () => {
  const childRef = useRef();
  const FChild = forwardRef(Child); // 函数组件如果要通过ref进行获取,需要通过forwardRef转换为高阶组件。

  const clickFather = () => {
    childRef.current.focus();
  };

  return (
    <div>
      <button onClick={clickFather}> click me </button>
      <FChild ref={childRef}></FChild>
    </div>
  );
};

ReactDOM.render(<Index />, document.getElementById('root'));

相关文章

网友评论

    本文标题:useRef、useImperativeHandle

    本文链接:https://www.haomeiwen.com/subject/igrwdktx.html