如何在 React 中将 useEffect 与 Suspense 一起使用?

Posted

技术标签:

【中文标题】如何在 React 中将 useEffect 与 Suspense 一起使用?【英文标题】:How can I use useEffect with Suspense in React? 【发布时间】:2022-01-13 18:59:14 【问题描述】:

您好,我想在我的页面加载时自动聚焦输入。我必须使用 Suspense,因为我使用的是 i18n。我有自动对焦代码,但效果不佳。

<Suspense fallback=<LoadingScreen/>>
  <Input />
</Suspense>
const Input = () => 
  const inputRef = useRef(null);
  useEffect(() => 
    inputRef.current.focus();
  , []);
  return (
    <input ref=inputRef type="text"/>
  );
;

当我消除悬念时,我的代码运行良好。但我需要 i18n 的悬念。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

你使用useCallback 而不是useEffect。

const Input = () => 
  const callbackRef = useCallback(ref => ref && ref.focus());
  return (
    <input ref=callbackRef type="text"/>
  );
;

它不起作用,因为在安装组件时调用了 useEffect,而这发生在 &lt;Suspese /&gt; 完成之前。

【讨论】:

同样的问题:(重新渲染时工作但刷新页面后不工作 好的,我知道问题出在哪里了,Suspense 在获取后立即开始渲染:reactjs.org/docs/… 您可以尝试使用useEffect(() =&gt; ref.current.focus(), [dataLoaded]) 进行修复,这将在您更改 dataLoaded 的状态时触发该函数 我想我可以用 redux 创建新状态,当卸载 LoadingScreen 组件时,我设置了 true pageLoaded redux 状态。当 pageLoaded 为真时,我专注于 useEffect。没事吧? 我认为这行得通 是的,它的工作,谢谢

以上是关于如何在 React 中将 useEffect 与 Suspense 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 useEffect 中将 JS 脚本与功能组件绑定

如何在 react.js 中的页面加载时显示引导模式?

如何在 React useEffect 中更改路由器

如何将 React 钩子(useContext、useEffect)与 Apollo 反应钩子(useQuery)结合起来

如何绕过 React 的 useEffect() “缺少依赖项”警告?

如何在反应中将函数转换为基于类的组件?