React 列表页面中管理接口请求的参数

在 React 列表页面中管理接口请求的参数时,通常涉及到以下几个步骤:

  1. 使用 useState 管理请求参数:将所有需要的请求参数(如分页、筛选条件、排序等)存储在 useState 中。
  2. 使用 useEffect 触发数据请求:每当请求参数发生变化时,通过 useEffect 钩子重新发起请求。
  3. 构建和发送请求:根据当前的请求参数构建请求,并通过 Axios 发送请求。
  4. 处理响应数据:将响应数据保存到组件状态中,以便渲染列表。

示例代码:

javascript 复制代码
import React, { useState, useEffect } from 'react';
import axios from 'axios';

const ProductList = () => {
  // 管理请求参数
  const [params, setParams] = useState({
    page: 1,
    pageSize: 10,
    category: '',
    sortBy: 'name',
    sortOrder: 'asc',
  });

  // 管理列表数据和加载状态
  const [products, setProducts] = useState([]);
  const [loading, setLoading] = useState(false);

  // 请求数据函数
  const fetchData = async () => {
    setLoading(true);
    try {
      const response = await axios.get('/api/products', { params });
      setProducts(response.data);
    } catch (error) {
      console.error('Error fetching data:', error);
    } finally {
      setLoading(false);
    }
  };

  // 每当请求参数变化时触发数据请求
  useEffect(() => {
    fetchData();
  }, [params]);

  // 更新请求参数的函数
  const updateParams = (newParams) => {
    setParams(prevParams => ({
      ...prevParams,
      ...newParams,
    }));
  };

  return (
    <div>
      <div>
        <input
          type="text"
          placeholder="Search by category"
          onChange={(e) => updateParams({ category: e.target.value, page: 1 })}
        />
        <select onChange={(e) => updateParams({ sortBy: e.target.value, page: 1 })}>
          <option value="name">Sort by Name</option>
          <option value="price">Sort by Price</option>
        </select>
        <button onClick={() => updateParams({ sortOrder: params.sortOrder === 'asc' ? 'desc' : 'asc' })}>
          Toggle Sort Order
        </button>
      </div>

      {loading ? (
        <p>Loading...</p>
      ) : (
        <ul>
          {products.map(product => (
            <li key={product.id}>{product.name} - {product.category} - ${product.price}</li>
          ))}
        </ul>
      )}

      <div>
        <button
          disabled={params.page === 1}
          onClick={() => updateParams({ page: params.page - 1 })}
        >
          Previous Page
        </button>
        <button
          onClick={() => updateParams({ page: params.page + 1 })}
        >
          Next Page
        </button>
      </div>
    </div>
  );
};

export default ProductList;
相关推荐
晴殇i4 分钟前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬24 分钟前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
BER_c25 分钟前
前端权限校验最佳实践:一个健壮的柯里化工具函数
前端·javascript
兆子龙28 分钟前
别再用 useState / data 管 Tabs 的 activeKey 了:和 URL 绑定才香
前端·架构
sudo_jin28 分钟前
前端包管理器演进史:为什么 npm 之后,Yarn 和 pnpm 成了新宠?
前端·npm
敲敲敲敲暴你脑袋1 小时前
写个添加注释的vscode插件
javascript·typescript·visual studio code
叁两1 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
golang学习记2 小时前
GitLens 十大神技:彻底改变你在 VS Code 中的 Git 工作流
前端·后端·visual studio code
SuperEugene2 小时前
后台权限与菜单渲染:基于路由和后端返回的几种实现方式
前端·javascript·vue.js
兆子龙2 小时前
WebSocket 入门:是什么、有什么用、脚本能帮你做什么
前端·架构