javascript - 如何根据复选框选择呈现列表?

标签 javascript reactjs redux react-redux

我有一个呈现一些产品的列表,这些产品分为一些类别。

我正在尝试通过复选框应用包含这些类别的过滤器。当用户选择该复选框时,必须使用所选类别更新列表。

我想知道如何根据复选框选择呈现产品列表?

我将我的代码放入 codesandbox因为有很多文件。

例如,在这里我只想渲染 ChypreFloriental 类别的产品。

enter image description here

这里我呈现我的产品列表:

import React, { useState, useMemo, useEffect } from "react";
import { useSelector } from "react-redux";

import CardItem from "../CardItem";
import Pagination from "../Pagination";
import Search from "../Search";
import { useStyles } from "./styles";

const Card = (props) => {
  const { activeFilter } = props;
  const classes = useStyles();
  const data = useSelector((state) => state.perfume.collections);
  const [searchPerfume, setSearchPerfume] = useState("");
  const [currentPage, setCurrentPage] = useState(1);
  const [perfumesPerPage, setPerfumesPerPage] = useState(3);

  console.log("activeFilter: ", activeFilter);

  const orderList = data
    .map((item) => ({
      ...item,
      totalSize: item.sizes.reduce((sum, cur) => sum + cur.price, 0)
    }))
    .sort((a, b) => a.totalSize - b.totalSize);

  const filteredPerfumes = useMemo(() => {
    return orderList.filter((perfume) =>
      perfume.name.toLowerCase().includes(searchPerfume.toLowerCase())
    );
  }, [orderList, searchPerfume]);

  const currentPerfumes = filteredPerfumes.slice(
    (currentPage - 1) * perfumesPerPage,
    currentPage * perfumesPerPage
  );
  const pages = Math.ceil(filteredPerfumes.length / perfumesPerPage);

  useEffect(() => {
    if (currentPage > pages) {
      setCurrentPage(1);
    }
  }, [currentPage, pages]);

  const pageNumbers = Array(pages)
    .fill(null)
    .map((val, index) => index + 1);

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

  return (
    <div>
      <Search
        data-testid="input-filter-id"
        setSearchPerfume={setSearchPerfume}
      />
      {currentPerfumes
        .filter((perfume) => {
          return (
            perfume.name.toLowerCase().indexOf(searchPerfume.toLowerCase()) >= 0
          );
        })
        .map((item) => (
          <CardItem key={item.id} item={item} />
        ))}
      <Pagination
        pageNumbers={pageNumbers}
        handleClick={handleClick}
        currentPage={currentPage}
      />
    </div>
  );
};

export default Card;

提前谢谢您。

最佳答案

试试那个

 const filteredPerfumes = useMemo(() => {
    const filtered = orderList.filter((perfume) =>
      perfume.name.toLowerCase().includes(searchPerfume.toLowerCase())
    );

    if (activeFilter.length > 0) {
      return filtered.filter((item) => item.categories.some((a) =>
        activeFilter.some((v) => v.text === a)
      ));
    }
    return filtered;
  }, [orderList, searchPerfume]);

关于javascript - 如何根据复选框选择呈现列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64316460/

相关文章:

javascript - VueJS 中的计算属性在输入失去焦点之前不会更新

javascript - 运行回归测试时不断出现 TypeError : config. suite.split is not a function

javascript - Meteor NodeJs base64 转换回文件

reactjs - 无法通过 ref 访问子函数?

javascript - 浏览对象数组并删除对象

javascript - 无法使用 React 中的 defaultValue 属性渲染 <select> 上的默认值

reactjs - REACT - 在渲染 APP 之前检查身份验证

forms - 在 Redux 表单的输入字段中设置值

javascript - 为什么 useReducer 的调度会导致重新渲染?

javascript - 在鼠标悬停时在具有特定类的元素之后插入 div