javascript - 与在 useEffect 中分配转发的 ref 相比,useImperativeHandle 有什么好处?

标签 javascript reactjs react-hooks

文档中提供的示例如下:

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} />;
}
FancyInput = forwardRef(FancyInput);

据我所知,我可以用
function FancyInput(props, ref) {
  const inputRef = useRef();
  useEffect(() => {
    if (ref) {
      ref.current = {
        focus: () => {
          inputRef.current.focus();
        }
      };
    }
  }, [ref]);
  return <input ref={inputRef} />;
}
FancyInput = forwardRef(FancyInput);

useImperativeHandle 不太冗长的可能解释对我来说似乎太微不足道了。引擎盖下是什么?是什么使它比 useEffect 版本必要或更好?

最佳答案

TLDR; useImperativeHandle是一样的只处理所有 ref案例并确保传递的值是 ref 而不仅仅是任何值。
回答您的问题 它为您处理使用 refs 时所需的一切,因此它节省了一些代码。

我在看 source code钩子(Hook)和引擎盖下的样子,useImperativeHandle与您使用 useEffect 的方法几乎相同.
你可以看一下钩子(Hook),看看它们有一个 HooksDispatcherOnMount , HooksDispatcherOnUpdateHooksDispatcherOnRerender .
如果您查看关联的函数(fooImperativeHandlefooEffect),您会发现它们都调用相同的函数(fooEffectImpl)。
所以很明显,在引擎盖下,它是同一件事,但在使用 useImperativeHandle 时你不需要处理.current的部分,它已经检查了 null值,检查它是否是 ref并在 .current 中设置返回值如您所见here .
这是我查看源代码得到的,但如果我错了,请纠正我。

关于javascript - 与在 useEffect 中分配转发的 ref 相比,useImperativeHandle 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59860956/

相关文章:

javascript - AngularJS ngModelController

javascript - 如何通知可折叠的折叠

javascript - jQuery 滚动功能不触发(滚动太快)

javascript - React HOC 无法将 Prop 传递给增强组件

javascript - 删除 Div Wrapper 或更改嵌套映射中某些分组元素的类名称

javascript - 是否可以将 ref 添加到 props.children 元素?

javascript - 在Vue中初始化 'marker-animate-unobtrusive'失败

javascript - 在组件内部使用 React 链接图像

reactjs - 如何使用 react 钩子(Hook)仅展开和折叠 Accordion 中的第一个项目?

reactjs - 如何在 React 中将项目从项目列表移动到收藏夹列表