React.JS React 查询设计模式

React.JS react query design pattern

提问人:fabio carvalho 提问时间:7/3/2023 更新时间:7/3/2023 访问量:236

问:

我正在使用 Rick and Morty API 和 react 查询并在 Home 组件中显示数据

Home 组件有 3 个子组件,用于显示数据的 Card、搜索功能和分页功能

我的问题是:我可以将与子组件相关的逻辑(状态、函数和变量)移动到另一个文件中吗?这样做是好的做法吗?我是 React 的新手,并试图理解设计模式。欢迎对文件夹结构提出任何建议...

我开发了以下代码,但我想更加模块化和更简洁......

import React, { useState } from 'react';
import { useCharacters } from './service/api';
import Cardi from './styles/blocks/Cardi';
import Pagination from './styles/blocks/Pagination';
import SearchInput from './styles/blocks/Search';

const Home = () => {
  const { data, isLoading, isError } = useCharacters(); //API Data
  const [currentPage, setCurrentPage] = useState(1); // State da página atual
  const [searchQuery, setSearchQuery] = useState(''); // State da barra de pesquisa
  const itemsPerPage = 9

  console.log('home' + data)

  if (isLoading) {
    return <div>Loading...</div>;
  }

  if (isError) {
    return <div>Error fetching data</div>;
  }

  //Set o state da barra de busca e set a página inicial para 1 para mostrar os resultados na primeira página
  const handleSearch = (event) => {
    setSearchQuery(event.target.value);
    setCurrentPage(1); // Reset to the first page when searching
  };

  // Filter the data based on the search query
  const filteredData = data.filter((item) =>
    item.name.toLowerCase().includes(searchQuery.toLowerCase())
  );

  // Calculate the range of items to display based on the current page
  const startIndex = (currentPage - 1) * itemsPerPage;
  const endIndex = startIndex + itemsPerPage;
  const currentItems = filteredData.slice(startIndex, endIndex);
  const totalPages = Math.ceil(filteredData.length / itemsPerPage);

  const handlePageChange = (page) => {
    setCurrentPage(page);
  };

  return (
    <div>
      <SearchInput value={searchQuery} onChange={handleSearch} />
      <Cardi.Grid>
        {currentItems.map((item) => (
             <Cardi key={item.id}>
               <Cardi.Image src={item.image}/> 
               <Cardi.Title>{item.name}</Cardi.Title>
               <Cardi.Specs>{item.species}</Cardi.Specs>
               <Cardi.Specs>{item.status}</Cardi.Specs>
               <Cardi.Button to={`/details/${item.id}`}></Cardi.Button>
             </Cardi>
        ))}
      </Cardi.Grid>
      <Pagination
        totalPages={totalPages}
        currentPage={currentPage}
        onPageChange={handlePageChange}
      />
    </div>
  );
};

export default Home;
reactjs 设计模式 react-query

评论

0赞 Aniket Das 7/3/2023
你可以做一个用于分页的钩子,一个用于数据获取的钩子等。举个例子:gist.github.com/Aniket-IN/50cb0653e3e3f15e943b25d9a706cdff 有 1 或 2 个特定于 Nextjs 的函数,否则一切都很简单 React.js

答:

0赞 Muhammad Saad Ur Rehman 7/3/2023 #1

您可以创建一个自定义钩子并移动状态,在其中起作用, 从自定义钩子中,您可以导出状态、函数

还有一个建议,您可以为 Cardi Items 创建一个单独的组件,并将与列表项相关的所有逻辑移动到该组件中。

    return (
    <div>
      <SearchInput value={searchQuery} onChange={handleSearch} />
      <Cardi.Grid>
        {currentItems.map((item) => (
             <CardiList item={item}/>
        ))}
      </Cardi.Grid>
      <Pagination
        totalPages={totalPages}
        currentPage={currentPage}
        onPageChange={handlePageChange}
      />
    </div>
  );