You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中实现动态商品筛选页:点击分类跳转至对应商品页

先修正你代码里的小问题

每个onClick的箭头函数括号没闭合,比如onClick={()=>{filter('women')}}才是正确写法,否则会触发语法错误。


分场景实现filter函数

场景1:单页应用(基于React Router v6+)

这是现在React项目最常用的方式,通过路由跳转传递分类参数,再在目标页面请求对应API数据。

1. Header组件里的filter函数实现

引入useNavigate钩子,点击分类时跳转到商品列表页并携带分类参数:

import { useNavigate } from 'react-router-dom';

function Header() {
  const navigate = useNavigate();

  const filter = (category) => {
    // 跳转到商品列表页,把分类作为路由参数
    navigate(`/products/${category}`);
  };

  return (
    <div className="category-list">
      <span className="category" onClick={()=>{filter('men')}}>Men </span>
      <span className="category" onClick={()=>{filter('women')}}>Women </span>
      <span className="category" onClick={()=>{filter('electronics')}}>Electronics </span>
      <span className="category" onClick={()=>{filter('beauty')}}>Beauty / Health </span>
      <span className="category" onClick={()=>{filter('accessories')}}>Accessories </span>
    </div>
  );
}
2. 商品列表页(ProductsPage)获取分类并请求API

在专门展示商品的页面,用useParams拿到路由里的分类参数,再调用API获取对应商品:

import { useParams, useEffect, useState } from 'react';

function ProductsPage() {
  const { category } = useParams();
  const [products, setProducts] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchCategoryProducts = async () => {
      try {
        // 替换成你的真实API地址
        const res = await fetch(`/api/products?category=${category}`);
        const data = await res.json();
        setProducts(data);
      } catch (err) {
        console.error('加载商品失败:', err);
      } finally {
        setLoading(false);
      }
    };

    if (category) fetchCategoryProducts();
  }, [category]);

  if (loading) return <div>加载中...</div>;

  return (
    <div className="products-container">
      {products.map(item => (
        <div key={item.id} className="product-card">
          <img src={item.image} alt={item.name} />
          <h3>{item.name}</h3>
          <p>${item.price}</p>
        </div>
      ))}
    </div>
  );
}
3. 配置路由

在路由配置文件里添加商品列表页的路由规则:

import { Routes, Route } from 'react-router-dom';
import Header from './Header';
import ProductsPage from './ProductsPage';

function App() {
  return (
    <div className="app">
      <Header />
      <Routes>
        {/* 其他路由... */}
        <Route path="/products/:category" element={<ProductsPage />} />
      </Routes>
    </div>
  );
}

场景2:传统多页应用

如果是非单页的传统项目,直接通过URL跳转并携带分类参数:

function Header() {
  const filter = (category) => {
    // 跳转到商品列表页面,把分类作为URL参数
    window.location.href = `/products.html?category=${category}`;
  };

  // 分类按钮代码同之前,略
}

然后在products.html的脚本里获取参数并请求API:

window.addEventListener('DOMContentLoaded', () => {
  const params = new URLSearchParams(window.location.search);
  const category = params.get('category');

  if (category) {
    fetch(`/api/products?category=${category}`)
      .then(res => res.json())
      .then(data => {
        const container = document.querySelector('.products-container');
        data.forEach(item => {
          const card = document.createElement('div');
          card.className = 'product-card';
          card.innerHTML = `
            <img src="${item.image}" alt="${item.name}" />
            <h3>${item.name}</h3>
            <p>$${item.price}</p>
          `;
          container.appendChild(card);
        });
      })
      .catch(err => console.error('加载商品失败:', err));
  }
});

内容的提问来源于stack exchange,提问作者bagewadi-akram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:40:39