我正在使用useQuery获取电影列表,之前我使用redux存储这些电影,我有一个搜索功能,当我搜索时,我会在store 中查找电影.现在,我try 使用react query将其替换为电影查询的缓存结果:

    const queryClient=useQueryClient();
    let queryClientPopular=queryClient.getQueryData('Popular')?.data?.results;
    let queryClientUpcoming=queryClient.getQueryData('Upcoming')?.data?.results;
    let queryClientTopRated=queryClient.getQueryData('Top Rated')?.data?.results;
    
    const getMovieIdForPlaceholderData=(queryClientMovies,query)=>{
        return queryClientMovies?.filter(movie=>movie.original_title.toLowerCase().startsWith(query));
     }
     
     const filterMovies=(query)=>{
        let dataQuery;
        let queryClientArr=[queryClientPopular,queryClientTopRated,queryClientUpcoming];
            
        for(let i=0;i<3;i++){
            dataQuery=getMovieIdForPlaceholderData(queryClientArr[i],query)
            if(dataQuery)break;
        }
    
        
        //let arr=globalState?.movie?.filter(mov=> {return mov.original_title.toLowerCase().startsWith(query)});
        //console.log(arr);
        setFilteredMovies(dataQuery);       
    }

我有两个担忧:

  1. 在我看来,这段代码看起来非常杂乱无章

  2. 如果用户刷新,我将丢失查询缓存数据

有没有更好的方法来解决这些问题?还是我应该坚持我的Reduxstore ?

推荐答案

React Query旨在缓存服务器响应,而不是让您在本地"搜索这些响应".这里的基本逻辑是,在某个时刻,服务器将保存大量数据,因此您无法将所有数据传递给客户端以在那里进行搜索,因此您应该向服务器请求所有信息.

这在大多数情况下都很好,即使在Redux工具包中,我们也有类似的方法来处理RTK Query.

如果你发现自己手动摆弄结果来创造新的东西,那么它可能并不适合你.这些"查询"库是文档缓存,而不是规范化缓存.它们非常适合"镜像服务器",但不适合"在本地篡改数据".如果你想做后者,你可能需要继续手动管理你的状态.

Reactjs相关问答推荐

使用useReducer时,props 未从父级传递给子或孙级

ReactJs;Reaction-Hook-Form:仅当 Select 了特定 Select 列表选项时才显示文本输入

在Reaction常量函数中未更新状态变量

有没有一种方法可以在没有强烈动画的情况下有条件地渲染组件?

在新屏幕上显示照片时出现问题-react

在ReactJS的monaco编辑器中添加美人鱼语法

在任何渲染之前在ReactJs中获取数据

通过createRoot创建的React元素无法调用Provider值

使用reactrouterdom时显示"对象无效作为React子组件"错误

React中useAuthenticator的authState在成功登录后仍保持未认证状态 - 需要强制刷新

无法读取未定义的属性(读取值)...TypeError:无法读取未定义的属性(读取值)

React - 使用 React 显示错误和积极alert

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

导入样式化组件时未导入组件内容

在 React 中将路径与查询变量匹配

如何使图标适合 react-bootstrap 中的行元素

react 本机日历

如何在自定义 JSX 元素上声明属性?

如何跨微前端 React 应用管理状态管理?

如何在组件文件夹内的react 组件文件中导入外部css文件?