react的函数式编程分页的时候还有查询条件,当翻页或者有查询条件的时候去调用接口,查询条件是个对象,如何实现,具体的代码

import React, { useState, useEffect } from 'react';
import axios from 'axios';

const API_BASE_URL = 'https://api.example.com/data';

const MyComponent = () => {
  const [data, setData] = useState([]);
  const [currentPage, setCurrentPage] = useState(1);
  const [totalPages, setTotalPages] = useState(1);
  const [query, setQuery] = useState({ keyword: '', category: '' });

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await axios.get(`${API_BASE_URL}`, {
          params: {
            page: currentPage,
            keyword: query.keyword,
            category: query.category,
          },
        });
        setData(response.data.results);
        setTotalPages(response.data.totalPages);
      } catch (error) {
        console.error('Error fetching data:', error);
      }
    };

    fetchData();
  }, [currentPage, query]);

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

  const handleQueryChange = (field, value) => {
    setQuery((prevQuery) => ({
      ...prevQuery,
      [field]: value,
    }));
  };

  return (
    <div>
      <input
        type="text"
        value={query.keyword}
        onChange={(e) => handleQueryChange('keyword', e.target.value)}
        placeholder="Enter keyword"
      />
      <input
        type="text"
        value={query.category}
        onChange={(e) => handleQueryChange('category', e.target.value)}
        placeholder="Enter category"
      />

      <ul>
        {data.map((item) => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>

      <div>
        <button onClick={() => handlePageChange(currentPage - 1)} disabled={currentPage === 1}>
          Previous
        </button>
        <span>Page {currentPage} of {totalPages}</span>
        <button onClick={() => handlePageChange(currentPage + 1)} disabled={currentPage === totalPages}>
          Next
        </button>
      </div>
    </div>
  );
};

export default MyComponent;

ts

import React, { useState, useEffect } from 'react';
import axios from 'axios';

interface Item {
  id: number;
  name: string;
  // 添加其他属性
}

interface ApiResponse {
  results: Item[];
  totalPages: number;
}

interface Query {
  keyword: string;
  category: string;
  // 添加其他查询条件
}

const API_BASE_URL = 'https://api.example.com/data';

const MyComponent: React.FC = () => {
  const [data, setData] = useState<Item[]>([]);
  const [currentPage, setCurrentPage] = useState(1);
  const [totalPages, setTotalPages] = useState(1);
  const [query, setQuery] = useState<Query>({ keyword: '', category: '' });

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await axios.get<ApiResponse>(API_BASE_URL, {
          params: {
            page: currentPage,
            keyword: query.keyword,
            category: query.category,
          },
        });
        setData(response.data.results);
        setTotalPages(response.data.totalPages);
      } catch (error) {
        console.error('Error fetching data:', error);
      }
    };

    fetchData();
  }, [currentPage, query]);

  const handlePageChange = (newPage: number) => {
    setCurrentPage(newPage);
  };

  const handleQueryChange = (field: keyof Query, value: string) => {
    setQuery((prevQuery) => ({
      ...prevQuery,
      [field]: value,
    }));
  };

  return (
    <div>
      <input
        type="text"
        value={query.keyword}
        onChange={(e) => handleQueryChange('keyword', e.target.value)}
        placeholder="Enter keyword"
      />
      <input
        type="text"
        value={query.category}
        onChange={(e) => handleQueryChange('category', e.target.value)}
        placeholder="Enter category"
      />

      <ul>
        {data.map((item) => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>

      <div>
        <button onClick={() => handlePageChange(currentPage - 1)} disabled={currentPage === 1}>
          Previous
        </button>
        <span>Page {currentPage} of {totalPages}</span>
        <button onClick={() => handlePageChange(currentPage + 1)} disabled={currentPage === totalPages}>
          Next
        </button>
      </div>
    </div>
  );
};

export default MyComponent;

在这个示例中,Item 表示每个数据项的类型,ApiResponse 表示 API 返回的数据类型,Query 表示查询条件的类型。使用 TypeScript 可以提供更好的类型检查,确保代码的稳定性。

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 07:20:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 07:20:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 07:20:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 07:20:05       20 阅读

热门阅读

  1. 软件工程 复习笔记

    2023-12-06 07:20:05       30 阅读
  2. 第18关 K8s数据安全无忧——持久化存储详解

    2023-12-06 07:20:05       72 阅读
  3. Ubuntu22 安装 mysql5.7 过程记录

    2023-12-06 07:20:05       39 阅读
  4. Redis使用Lua脚本

    2023-12-06 07:20:05       45 阅读
  5. ubuntu 修改系统时间,解决更新软件报错问题

    2023-12-06 07:20:05       46 阅读
  6. Flink入门之DataStream API及kafka消费者

    2023-12-06 07:20:05       37 阅读
  7. golang 实现和linephone的功能

    2023-12-06 07:20:05       36 阅读
  8. Kafka Schema介绍

    2023-12-06 07:20:05       43 阅读
  9. Kotlin 中的 var 和 val:选择正确的变量声明

    2023-12-06 07:20:05       37 阅读
  10. 比较 Apache Hive 和 Spark

    2023-12-06 07:20:05       32 阅读
  11. JeecgBoot 框架升级 Spring Boot 3.1.5

    2023-12-06 07:20:05       36 阅读
  12. html简单的表格制作

    2023-12-06 07:20:05       35 阅读