简体   繁体   English

过滤产品进入 搜索输入 ReactJS

[英]Filter products on enter Search input ReactJS

I have list of products.我有产品清单。 I want to display only products that have a description or name containing typed word by clicking enter on search input .我想通过单击搜索input上的输入来仅显示具有包含键入单词的描述或名称的产品。 So I tried this in my Search component所以我在我的Search组件中尝试了这个

const Search = (props) => {
  return (
    <InputGroup className="container custom-input-group">
      <FontAwesomeIcon icon={faSearch} className="icon" />
      <FormControl
        placeholder="Search"
        type="text"
        className="mr-sm-2"
        onChange={(e) => props.onSearch(e.target.value)}
        value={props.value}
      />
    </InputGroup>
  );
};

And this in my App component这在我的App组件中

const App = (props) => {
  const [cartProducts, setCartProducts] = useState([]);
  const [products, setProducts] = useState(getProducts());

  const [searchValue, setSearchValue] = useState();

  const handleAddProductToCart = (productID) => {
    console.log(productID);
    setCartProducts([...cartProducts, productID]);
  };
  const handleRemoveFromCart = (productID) => {
    const newCartProducts = cartProducts.filter((id) => id !== productID);
    setCartProducts(newCartProducts);
  };

  const filterItems = ({ description, title }) => {
    return title.toLocaleLowerCase().indexOf(searchValue.toLocaleLowerCase())
      || description.toLocaleLowerCase().indexOf(searchValue.toLocaleLowerCase())
  }

  return (
    <>
      <Header />
      <Search onSearch={setSearchValue} value={searchValue} />
          {products.filter(filterItems).map((product, id) => (
      <Product key={product.id} {...product}/> 
       ))}
      <Sidebar />
      {products.map((product) => {
        const { id } = product;
        let haveInCart = false;

        cartProducts.forEach((productID) => {
          if (productID === id) {
            haveInCart = true;
          }
        });

        return (
          <Product
            key={product.id}
            product={product}
            handleAddProductToCart={handleAddProductToCart}
          />
        );
      })}
      <h2>Your Cart</h2>
      {cartProducts.length > 0
        ? cartProducts.map((productID) => {
            const productIndex = products.findIndex((product) => {
              return product.id === productID;
            });
            let product = products[productIndex];
            return (
              <CartProduct
                key={product.id}
                product={product}
                handleRemoveFromCart={handleRemoveFromCart}
                haveInCart={true}
              />
            );
          })
        : "Yor Cart is Empty :("}
    </>
  );
};

It's giving me SyntaxError.它给了我语法错误。 What am I doing wrong?我究竟做错了什么?

Code sandbox https://codesandbox.io/s/cat-toys-n23m6?file=/src/App.jsx:275-2222代码沙箱https://codesandbox.io/s/cat-toys-n23m6?file=/src/App.jsx:275-2222

EDIT I found I was missing ))} but it's still not working编辑我发现我失踪了))}但它仍然无法正常工作

Add an empty tag in your map function在您的 map function 中添加一个空标签

{
  products.filter(filterItems).map((product, id) => (
    <>  {/* here */}
      <Product key={product.id} {...product}/> 
      <Sidebar />
      {
        products.map((product) => {
          const { id } = product;
          let haveInCart = false;
          cartProducts.forEach((productID) => {
            if (productID === id) {
              haveInCart = true;
            }
          });
          return (
            <Product
              key={product.id}
              product={product}
              handleAddProductToCart={handleAddProductToCart}
            />
          );
        })
      }
    </>  {/* here */}
))}

EDIT编辑

I have made changes to your code.我已对您的代码进行了更改。 Now it's your turn;)现在轮到你了;)

Demo: stackblitz演示: stackblitz

I forked your sandbox.我分叉了你的沙箱。 Here's the code这是代码

return (
<>
  <Header />

  <Search onSearch={setSearchValue} value={searchValue} />

  {products.filter(filterItems).map((product, id) => (
    <div>
      <Product key={product.id} {...product} />

      <Sidebar />

      {products.map((product) => {
        const { id } = product;
        let haveInCart = false;

        cartProducts.forEach((productID) => {
          if (productID === id) {
            haveInCart = true;
          }
        });

        return (
          <Product
            key={product.id}
            product={product}
            handleAddProductToCart={handleAddProductToCart}
          />
        );
      })}

      <h2>Your Cart</h2>

      {cartProducts.length > 0
        ? cartProducts.map((productID) => {
            const productIndex = products.findIndex((product) => {
              return product.id === productID;
            });
            let product = products[productIndex];
            return (
              <CartProduct
                key={product.id}
                product={product}
                handleRemoveFromCart={handleRemoveFromCart}
                haveInCart={true}
              />
            );
          })
        : "Yor Cart is Empty :("}
    </div>
  ))}
</>
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM