reactjs RTK查询-在其他组件中过滤查询结果

qvsjd97n  于 2023-10-17  发布在  React
关注(0)|答案(1)|浏览(120)

我正在用NextJS 13开发一个Todo应用程序,包括应用程序目录、prisma、redux工具包、shadcnui和clerk。我的APP里有两个组件。一个是TodoList,另一个是Filter。在TodoList中,我使用RTK Query检索所有的todos。在Filter组件中,我想根据这些待办事项是否完成来过滤它们。我正在寻找最有效的解决方案。
我目前的做法是这样的:

'use client';

import AddTodoSheet from '@/components/AddTodoSheet';
import Filter from '@/components/Filter';
import TodoList from '@/components/TodoList';
import { Separator } from '@/components/ui/separator';
import { useGetTodosQuery } from '@/redux/features/api/apiSlice';
import { Todo } from '@prisma/client';
import React from 'react';

const TodoPage = () => {
  const { data, isLoading, isError } = useGetTodosQuery({});
  const [filter, setFilter] = React.useState(null);
  const [todos, setTodos] = React.useState(data);

  React.useEffect(() => {
    let filteredTodos = [];

    if (filter === 'completed') {
      filteredTodos = data?.filter((todo: Todo) => todo.isCompleted === true);
      setTodos(filteredTodos);
    }

    if (filter === 'waiting') {
      filteredTodos = data?.filter((todo: Todo) => todo.isCompleted === false);
      setTodos(filteredTodos);
    }

    if (filter === 'all') {
      filteredTodos = data;
      setTodos(filteredTodos);
    }
  }, [filter, data]);

  return (
    <div className=''>
      <div className='flex items-center justify-between mt-2'>
        <Filter filter={filter} setFilter={setFilter} />
        <AddTodoSheet />
      </div>
      <Separator className='my-2' />
      <div className=''>{!isLoading && <TodoList data={todos || data} />}</div>
    </div>
  );
};

export default TodoPage;
import React from 'react';
import TodoItem from './TodoItem';
import { Todo } from '@prisma/client';

const TodoList = ({ data }: { data: any }) => {
  return (
    <div>
      {data.map((todo: Todo) => (
        <TodoItem key={todo.id.toString()} todo={todo} />
      ))}
    </div>
  );
};

export default TodoList;
import React from 'react';
import { Tabs, TabsList, TabsTrigger } from './ui/tabs';

const Filter = ({ filter, setFilter }: { filter: any; setFilter: any }) => {
  return (
    <Tabs defaultValue='all' onValueChange={(e) => setFilter(e)}>
      <TabsList>
        <TabsTrigger value='all'>All</TabsTrigger>
        <TabsTrigger value='completed'>Completed</TabsTrigger>
        <TabsTrigger value='waiting'>Waiting</TabsTrigger>
      </TabsList>
    </Tabs>
  );
};

export default Filter;

有没有更好的解决办法?

8hhllhi2

8hhllhi21#

我相信这对于一个todoList来说已经足够好了。
在你有大量数据的情况下。你可能会遇到一些性能问题的应用程序。
除非你从2000个数据集中加载100个,并在客户端过滤掉这一小部分。
您的Rtk查询将如下所示

getAllTodo: build. Query({ 
        query: ({ page, pageSize, filter, sort, search }) => ({
            url:"client/alltodo",
            method: "GET",
            params: { page, pageSize, sort, search},
        }),
        providesTags: ["Todolist"]
    }),

您的API URL将类似于https://xxxxxxxxxxx.com/client/alltodo?page=1&pageSize=20&filter=warning
这样,您就可以对数据过滤器和排序进行分页。如果数据不是很大…那你就不必这么做
我希望这能帮上忙。
Have a lovely day and Happy Hacking(祝你有愉快的一天,黑客快乐)

相关问题