如何过滤数组以匹配参数值与反应

How to filter array to match params value with react

我想使用 react-bootstrap 创建一个电子商务 Web 应用程序。我希望页面根据类别显示不同的项目,所以如果 URL 是 product/men'sclothing 我想过滤我的数组并仅显示具有相同类别的男装产品(我的路径:产品分类)。我已经尝试使用 .filter 方法过滤我的数组,但它没有用,它仍然显示来自不同类别的所有产品,我该如何修复它?

分类产品页面:

const ProductList = () => {
  const { category } = useParams()
  const[productList, setProductList]= useState();

  useEffect(() =>{
    axios.get(`https://fakestoreapi.com/products`).then(res => {
        const products = res.data;
        setProductList(products);

        var filteredCategory =
         productList.filter((productList) =>productList.category === {category})
      })
  }, []);

  console.log(productList)

  return (
    <>
      <Row>
        <h1> This is {category} paged</h1>
        {productList && productList.map(product =>{
          const {id, title, price, category,description,image} = product;
          return(
          <Col lg={3} className="d-flex">
            <Card key={id} className="flex-fill productlist">
              <Card.Img variant="top" src={image} />
              <Card.Body>
                <Card.Title>{title}</Card.Title>
                <Card.Text>{category}</Card.Text>
                <Card.Text>
                  Current Price: {price}
                </Card.Text>
                <Button variant="primary">Add to cart</Button>
              </Card.Body>
            </Card>
          </Col>
          )
        })}
      </Row>
    </>
  )
}

export default ProductList

首先,将依赖项添加到 UseEffect,然后移除过滤器内的括号。

useEffect(() => {
  async function getByCategory(){
   const req = await fetch(URL):
   const res = await req.json();
   const filter = res.filter((item) => item.category === category);
   setProductList(filter);
  }
  // check if params exits
  if(category){
      getByCategory();
  }
}, [category]);

尝试去掉过滤器函数中类别变量周围的 {}。过滤器函数不在 return 语句内,因此是纯 js(不是 jsx)。

此外,您永远不会使用包含过滤产品的数组。我建议过滤您从 axios 获得的产品,将过滤后的产品放入 setProductList 状态。

由于我在移动设备上,因此无法对此进行测试,但请尝试一下。

在你用过的filter函数中,试试写成

productList.filter((product) => product.category === category)
  1. 当您将其写为{category}时,将创建一个对象,其中键类别和值作为实际值。例如,如果 category 的值为 shoes,它将创建一个对象,{ category: "shoes" }。
  2. 您还需要在 useEffect 依赖项中添加类别,每次更新类别时 re-fetch 产品。

比较元素时去掉大括号。

__你的代码

productList.filter((productList) =>productList.category === {category})

__NEW

productList.filter((productList) =>productList.category === category)

您仍在列出所有产品,因为在您的代码中,您循环遍历 productList 状态而不是来自过滤数据的新值。

{productList && productList.map(product =>{
    // this is the way you have defined your map code
}) }

应该是这样的

const ProductList = () => {
    const { category } = useParams()
    const[productList, setProductList]= useState();


    useEffect(() =>{
    axios.get(`https://fakestoreapi.com/products`).then(res => {
        const products = res.data;
        setProductList(products);
        })
    }, []);

    let filteredProducts = null;

    if(category) {
        filteredProducts = productList.filter((productList) => productList.category === category);
    } else {
        filteredProducts = products;
    }
         

    return (
        <>
          <Row>
            <h1> This is {category} paged</h1>
            {filteredProducts && filteredProducts.map(product =>{
               // some code 
            })}
          </Row>
        </>
    )
}

export default ProductList

如您所见,我定义了一个变量 filter Products,其中包含与从 url 获得的类别相关的产品,如果它存在,否则它将使用整个产品列表