在React中使用 useImperativeHandle 和 forwardRef 操作子組件

import React, {
  useRef,
  useImperativeHandle,
  useState,
  forwardRef
} from "react";

function Son(props, ref) {
  console.log(props);
  const inputRef = useRef(null);
  const [inputValue, setInputValue] = useState("");
  useImperativeHandle(
    ref,
    () => {
      const handleRefs = {
        /* 聲明方法用于聚焦input框 */
        onFocus() {
          inputRef.current.focus();
        },
        /* 聲明方法用于改變input的值 */
        onChangeValue(value) {
          setInputValue(value);
        }
      };
      return handleRefs;
    },
    []
  );
  return (
    <div>
      <input placeholder="請輸入內容" ref={inputRef} value={inputValue} />
    </div>
  );
}

const ForwarSon = forwardRef(Son);

const Index = () => {
  let inputRef = null;

  const handerClick = () => {
    const { onFocus, onChangeValue } = inputRef;
    onFocus();
    onChangeValue("let us learn React!");
  };

  return (
    <div style={{ marginTop: "50px" }}>
      <ForwarSon
        ref={(node) => {
          inputRef = node;
        }}
      />
      <button onClick={handerClick}>操控子組件</button>
    </div>
  );
};

// class Index extends React.Component {
//   inputRef = null;

//   handerClick() {
//     const { onFocus, onChangeValue } = this.inputRef;
//     onFocus();
//     onChangeValue("let us learn React!");
//   }

//   render() {
//     return (
//       <div style={{ marginTop: "50px" }}>
//         <ForwarSon ref={(node) => (this.inputRef = node)} />
//         <button onClick={this.handerClick.bind(this)}>操控子組件</button>
//       </div>
//     );
//   }
// }

export default Index;
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容