【问题标题】:Redux Toolkit Query - Invalidating old dataRedux Toolkit 查询 - 使旧数据无效
【发布时间】:2022-01-05 20:10:39
【问题描述】:

我有一个MediaCard 组件,它包含一个img 元素和一个带有令牌的url。必须首先需要此令牌才能获取图像。这里需要注意的是令牌将在 30 秒后过期。应该是这样的:

const MediaCard = () => {

    // This should refetch the token everytime a new component is 
    // mounted and 30 seconds has passed since the last fetch

    const { data: token, error: tokenError, isLoading: tokenIsLoading } = useGetTokenQuery(undefined, { refetchOnMountOrArgChange: 30 });

    if (tokenError) return 'Error'

    if (tokenIsLoading) return 'Loading skeleton'

    return (
       <img url={`/url/${token}/image1.jpg`}
    )
     

当我只有一个 MediaCard 组件时,一切正常。当我安装第一张媒体卡,加载令牌然后渲染图像时,问题就开始了。然后,如果我让 30 秒过去,当我尝试挂载新的 MediaCard 时,钩子将开始重新获取令牌,但保留旧数据。这带来了两个不同的问题:

  1. 当新组件挂载时,由于我们有一个过期的令牌作为数据,图像将无法加载。然后,在接收到新令牌后,图像将重新渲染并开始工作。
  2. 一旦收到新的令牌,所有以前安装的图像都会重新渲染。我希望在使用有效令牌渲染图像后保持这种方式并且不再渲染。

也许解决方案不是关于 RTK Query,而是 React 本身。

【问题讨论】:

    标签: reactjs redux redux-toolkit rtk-query


    【解决方案1】:

    RTK Query“查询”的重点是“反映”服务器的状态——这意味着我们假设对具有相同参数的某个端点的请求将始终具有最新的“最新”响应(将它们视为 REST 资源)- 并将保持所有这些查询响应在组件边界上彼此同步。

    在您的情况下,您似乎不希望这样,您希望这些在组件本地。 老实说,您不需要像 Redux 这样的全局状态 - 您可以发出请求并将响应保存到本地组件状态中。

    如果您仍然想使用 RTK 查询,您可能应该在此处使用突变而不是查询 - 因为每个组件的突变结果都是唯一的。并且在组件挂载后直接在useEffect 中触发突变触发器。

    【讨论】:

    • 是的,我知道这不是库的重点,但我已经在应用程序的其余部分中使用,并且宁愿以相同的方式发出请求。我认为我想从库中利用的一个是将令牌缓存 30 秒。我让它工作了,但是一旦刷新了令牌,所有其他 MediaCard 组件也被刷新了。因此,我现在正在尝试找到一种方法来“修复”已经获得先前令牌的组件,以便在收到新令牌后不重新渲染。也许使用 React.memo ?
    • 我已经告诉过你了。使用突变,而不是查询。这样,每个组件的结果都是独立的。
    • 这行得通,但我无法将令牌缓存长达 30 秒,对吧?
    • 只要它被挂载,它就会在每个组件中无限地保存它,但不会在组件之间共享它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2021-11-06
    • 2021-09-10
    • 2021-11-24
    • 2021-11-04
    • 2022-11-03
    • 2022-07-12
    相关资源
    最近更新 更多