在react-query中过滤数据

sau*_*r94 2 reactjs react-query

我需要在我的组件中过滤电影。初始查询必须是所有电影。在我单击按钮(按钮名称例如history/\xd1\x81omedy)后,我在反应组件中渲染的数据必须更改为仅包含历史记录或\xd1\x81omedian 电影的此类查询的数据。我怎样才能在react-query中实现这一点?

\n

TkD*_*odo 5

理想情况下,过滤应该在后端进行。这样,您只需将过滤后的电影的名称作为查询键的一部分即可。如果键发生变化,React Query 将自动重新获取,并且还会单独缓存每个条目过滤:

const [name, setName] = React.useState()
const { data } = useQuery(['movies', name], () => fetchMovies(name)))
Run Code Online (Sandbox Code Playgroud)

如果后端不进行过滤,则可以只对 useQuery 返回的数据进行过滤:

const [name, setName] = React.useState()
const { data } = useQuery(['movies'], () => fetchMovies()))

const result = filterByName(data, name)
Run Code Online (Sandbox Code Playgroud)

这很适合定制钩子。

如果需要参考稳定性,您可以将结果创建包装在useMemo

const result = React.useMemo(() => filterByName(data, name), [data, name])
Run Code Online (Sandbox Code Playgroud)

您还可以利用selectreact-query的选项:

const [name, setName] = React.useState()
const { data } = useQuery(
  ['movies'],
  () => fetchMovies()),
  {
    select: (response) => filterByName(response, name)
  }
)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,data返回的 fromuseQuery将已经被过滤,并且您不必担心记忆。

  • 好的,非常感谢您的详细回答。我会尝试。 (2认同)
  • 您能详细说明一下为什么过滤应该发生在后端吗?蒂亚 (2认同)