西湖专业网站设计公司,优秀品牌企业网站建设案例,公司怎么建设网站,wordpress菜单小图标不显示通过 useImperativeHandle#xff0c;子组件可以选择性地暴露给父组件某些属性或方法#xff0c;而不是将所有属性和方法暴露出去。 父组件 获得自组件的 ref#xff0c;就能通过该 ref 来调用 focus来聚焦等功能 在 forwardRef 包装的组件中#xff0c;ref 固定地是第二个… 通过 useImperativeHandle子组件可以选择性地暴露给父组件某些属性或方法而不是将所有属性和方法暴露出去。 父组件 获得自组件的 ref就能通过该 ref 来调用 focus来聚焦等功能 在 forwardRef 包装的组件中ref 固定地是第二个参数而第一个参数是这个组件接受的 props。这是 React 为了确保 forwardRef 正确工作而规定的。所以在这种情况下ref 必须放在第二个参数的位置。 app.jsimport { useRef } from react;
import MyInput from ./MyInput.js;export default function Form() {const ref useRef(null);function handleClick() {ref.current.focus();// 下方代码不起作用因为 DOM 节点并未被暴露出来// ref.current.style.opacity 0.5;}return (formMyInput placeholderEnter your name ref{ref} /button typebutton onClick{handleClick}Edit/button/form);
}myInput.jsimport { forwardRef, useRef, useImperativeHandle } from react;const MyInput forwardRef(function MyInput(props, ref) {const inputRef useRef(null);useImperativeHandle(ref, () {return {focus() {inputRef.current.focus();},scrollIntoView() {inputRef.current.scrollIntoView();},};}, []);return input {...props} ref{inputRef} /;
});export default MyInput; 不要滥用 ref。 你应当仅在你没法通过 prop 来表达 命令式 行为的时候才使用 ref例如滚动到指定节点、聚焦某个节点、触发一次动画以及选择文本等等。 如果可以通过 prop 实现那就不应该使用 ref。例如你不应该从一个 Model 组件暴露出 {open, close} 这样的命令式句柄最好是像 这样将 isOpen 作为一个 prop。副作用 可以帮你通过 prop 来暴露一些命令式的行为。