【问题标题】:React.JS Map data use Hooks useState to set data on page loadReact.JS Map 数据使用 Hooks useState 在页面加载时设置数据
【发布时间】:2021-04-15 20:51:16
【问题描述】:

我正在将数据从 App 传递到我的 Store 组件...当页面加载时,我试图使用 useState 来显示当前产品,以便稍后进行过滤。当我对此使用 useEffect 时,我得到了一个奇怪的 OBJ 返回,我不确定我做错了什么......

当我尝试在函数 filterBrand() 和 filterSize() 中使用 console.log(storeItems) 时,我正在获取第二个/第三个 OBJ 的控制台日志。不知道如何过滤,老实说,我第一次看到...尝试学习最佳实践,所以随时提供解释/示例!谢谢你:)

import React, { useState, useEffect } from "react";
import StoreItems from "./StoreItems.jsx";
import Filter from "../Filters/Filter";

const Store = ({ products, onAddToCart }) => {
    const [storeItems, setStoreItems] = useState([]);
    const [productSize, setProductSize] = useState("");
    const [productBrand, setProductBrand] = useState("");
    const [productCount, setProductCount] = useState(0);

    useEffect(() => {
        console.log(products)

        const allProducts = products.map((product, i) => {
            return (
                <StoreItems key={i} product={product} onAddToCart={onAddToCart} />
            );
        })

        console.log(allProducts)

        setStoreItems(allProducts)

        console.log(storeItems)

    }, [])


    const filterBrand = (event) => {
        setProductBrand(event.target.value)
        console.log(event.target.value)
        console.log(storeItems)
    }

    const filterSize = (event) => {
        setProductSize(event.target.value)
        console.log(event.target.value)
        console.log(storeItems)
    }


    return (
        <main className="storeContent">
            <Filter products={products} productSize={productSize} productBrand={productBrand} productCount={productCount} filterBrand={filterBrand} filterSize={filterSize} />
            <div className="productContainer">
                {storeItems}
            </div>
        </main>
    );
};

export default Store;

张贴返回的屏幕截图

第一个控制台日志是 console.log(products)

第二个是console.log(allProducts)

第三个是 console.log(storeItems)

【问题讨论】:

  • 渲染是否正确?
  • 你为什么把所有的项目都存储在allProducts 中?
  • 它确实如屏幕截图所示正确渲染,但我需要按 productBrand 和 productSize 过滤这些,但返回的 OBJ 是我附加的 img 中的第二个 OBJ,所以我很好奇为什么它这样做.. 很难解析数据
  • 我真的只是想在页面加载时将“产品”OBJ 设置为 storeItems,如果我做错了,请随时展示您将如何做到这一点!真的很好奇并试图学习最佳实践。新手在这里嘿嘿@emkarachchi
  • products.map((product, i) =&gt; { return ( &lt;StoreItems key={i} product={product} onAddToCart={onAddToCart} /&gt; ); }) 替换return 语句中的storeItems 是否有效?您还可以使用products 数组来过滤数据。从渲染的UI components 中过滤数据会更难

标签: reactjs react-hooks use-effect


【解决方案1】:

useEffect 方法中不需要有以下代码。

const allProducts = products.map((product, i) => {
    return (
        <StoreItems key={i} product={product} onAddToCart={onAddToCart} />
    );
})

为了实现预期的行为,

您可以在Store 组件中将products 设置为您的状态。

const [storeItems, setStoreItems] = useState(products);

useEffect(() => {storeItems(products)}, [products])

您可以使用如下简单的方法将数据呈现到 UI。

const renderProducts = () => {
    return storeItems.map((product, i) => {
        return (<StoreItems key={i} product={product} onAddToCart={onAddToCart} />);
    })
}

然后在您的return 语句中,只需将storeItems 更改为renderProducts()。最后你的return 应该如下所示,

    return (
        <main className="storeContent">
            <Filter products={products} productSize={productSize} productBrand={productBrand} productCount={productCount} filterBrand={filterBrand} filterSize={filterSize} />
            <div className="productContainer">
                {renderProducts()} //This line is important.
            </div>
        </main>
    );

然后,每当您想要过滤项目时,您都可以使用类似的东西,

const filterProductsByName = () => {
    let filteredProducts = storeItems.filter(function (item) {
        return item.name === "some product name";
    });
    setStoreItems(filteredProducts);
}

如果你想回到原来的状态,只需使用,

setStoreItems(products);

【讨论】:

  • 我想我感到困惑的地方是产品在项目的初始启动时不呈现...有时如果我保存文件并重新启动/重新呈现项目,则不会显示任何项目。
  • 控制台上是否出现任何错误? .尝试添加useEffect(() =&gt; {storeItems(products)}, [products])
  • 在 useEffect(() => { setStoreItems(products) }, [products]) 中添加了这个,现在我正在加载产品!
  • 恐怕用这种方法我无法过滤,或者有点理解如何过滤
  • 好吧,我发现我错过了我的事件参数,但我只能过滤一次... const filterBrand = (event) => { setProductBrand(event.target.value) let filteredProducts = storeItems.filter( function (product, i) { if (product.name.includes(event.target.value)) { return ( ) } else { 控制台。日志(“假”)}}); setStoreItems(filteredProducts); }
【解决方案2】:
    const filterBrand = (event) => {
        setProductBrand(event.target.value)

        let filteredProduct = products.filter(product => product.name.includes(event.target.value));
        setStoreItems(filteredProduct);
        setProductCount(filteredProduct.length)

        if (event.target.value === "All") {
            setStoreItems(products)
        };
    }
    const filterSize = (event) => {
        setProductSize(event.target.value)

        let filteredSize = products.filter(product => 
         product.name.includes(event.target.value));
        setStoreItems(filteredSize);
        setProductCount(filteredSize.length)


        if (event.target.value === "All") {
            setStoreItems(products)
        };
    }

这些似乎适用于过滤和 productCount...

仍在试图弄清楚为什么这会返回 0 个产品

    const renderProducts = () => {
        return storeItems.map((product, i) => {
            console.log(product)
            return (
                <StoreItems key={i} product={product} onAddToCart={onAddToCart} />
            );
        })
    }

【讨论】:

  • 不要使用答案部分来扩展问题。只需更新您的问题
猜你喜欢
  • 2022-12-12
  • 2016-12-18
  • 2019-08-14
  • 2018-12-04
  • 2020-02-19
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多