如何使用 React suspense 更新 redux 存储

Posted

技术标签:

【中文标题】如何使用 React suspense 更新 redux 存储【英文标题】:How to update redux store with react suspense 【发布时间】:2021-10-10 17:03:47 【问题描述】:

在下面的代码中,Sample 使用async 函数来获取一些数据。我将使用这些数据来更新 Redux 存储,以便任何组件都可以访问应用程序中的 username

const resource = fetchData();

function Sample() 
    // throws a promise when retrieving data
    const name = resource.read();

    const dispatch = useDispatch();
    dispatch(setUsername(name));

    const username = useSelector((state) => state.username);

    return <div>User: username</div>;


<Suspense fallback="loading....">
    <Sample />
</Suspense>

在这里,假设没有用户名我的应用程序无法继续。好吧,父级别的&lt;Suspense&gt; 实现了这一点,直到从资源中获取数据。但是,从 Redux 事件调度到 &lt;Sample&gt; 组件重新渲染有一点差距,其中显示 User: 而不是 loading....(事件不要立即强制重新渲染,所以 username 是空的)。所以我会以相同的顺序在网页中看到以下内容

loading.... --> User: --> User: Srinesh

所以我的要求是在商店更新之前显示loading....。在网页上,我期待看到,

loading.... --> User: Srinesh

如果用户名是null,有没有办法在不使用&lt;Sample&gt; 组件级别的另一个条件来显示loading.... 的情况下实现此目的?

【问题讨论】:

【参考方案1】:

第一个问题是在组件渲染逻辑中间调度是一个副作用,你绝对不能这样做。

更安全的地方是 useLayoutEffect 钩子,它会在组件完成渲染后立即调度,但在浏览器有机会绘画之前强制同步重新渲染。这样你就不会看到闪光灯了。

【讨论】:

以上是关于如何使用 React suspense 更新 redux 存储的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React.lazy 和 Suspense 中获取加载进度

如何将从远程 API 获取的初始数据与 React.Suspense 集成?

如何使用React.lazy和Suspense进行组件延迟加载

React18: 如何使用Suspense 等待数据异步加载

React.lazy和Suspense组合实现组件懒加载

如何让 webpack-dev-server 停止使用 React 延迟/Suspense 代码拆分在内容更改时下载不正确的块?