作用
示例
// 简单使用
import React, { useEffect, useRef } from "react";
// 用在 class 组件
// const ref = React.createRef();
export function RefDemo() {
const ref = useRef(null);
useEffect(() => {
console.log(ref.current);
}, []);
return (
<div>
<h2 ref={ref}>Ref Demo</h2>
</div>
)
}
// 绑定多个 ref
import React, { useEffect, useRef } from "react";
interface Refs {
c1?: HTMLHeadingElement | null;
c2?: HTMLHeadingElement | null;
c3?: HTMLHeadingElement | null;
}
export function RefDemo() {
const refs = useRef<Refs>({});
useEffect(() => {
console.log(refs.current);
}, []);
return (
<div>
<h2 ref={(node) => { refs.current.c1 = node }}>Ref 1 Demo</h2>
<h2 ref={(node) => { refs.current.c2 = node }}>Ref 2 Demo</h2>
<h2 ref={(node) => { refs.current.c3 = node }}>Ref 3 Demo</h2>
</div>
)
}
作用
示例
import React, { forwardRef, useEffect, useId, useRef } from "react";
interface InputProps {};
const Input = forwardRef<HTMLInputElement, InputProps>((props, ref) => {
const id = useId();
return (
<div style={{ display: "flex" }}>
<label htmlFor={id}>child input</label>
<input id={id} ref={ref} />
</div>
)
});
export const ForwardRefDemo = () => {
const ref = useRef<HTMLInputElement | null>(null);
useEffect(() => {
console.log(ref);
}, []);
return <Input ref={ref} />
}
useImperativeHandle 和 forwardRef 往往一起出现,但它们的职责是完全不同的层级。
React 的 useImperativeHandle 是一个 Hook,用来 自定义暴露给父组件的 ref 内容。
换句话说:
useImperativeHandle(ref, createHandle, [deps])