【问题标题】:React .map is not a function on array of objectsReact .map 不是对象数组上的函数
【发布时间】:2020-12-26 17:30:08
【问题描述】:

我正在尝试从我的 api 获取所有产品。
产品 API 代码如下。
下面的代码运行良好:

const heh = () => {
        products.map((p) => console.log(p.id))
    }

问题是我的const allProducts 中的 products.map 告诉我TypeError: products.map is not a function
附:我检查了所有类型。我得到对象数组。 完整代码如下:

const Product = ({products}) => {
    const heh = () => {
        products.map((p) => console.log(p.id))
    }
    const allProducts = products.map((p) => (
        <div className="product" key={p.id}>
            <h3>{p.name} - {p.price}</h3>
            <p>{p.description}</p>
        </div>)
        )
    return (
        <div>
            <button onClick={() => heh()}>Click</button>
            {allProducts}
        </div>
        
    )
}


const Test = () => {
    const [products, setProducts] = React.useState([])

    React.useEffect(() => {
        const fetchProducts = async () => {
            const result = await axios('/api/v1/products')
            console.log(result.data.data)
            setProducts(result.data)
        }

        fetchProducts()
        
    }, [])

    return (
        <div>
            <Product products={products} />
        </div>
    )
}

ReactDOM.render(React.createElement(Test), document.getElementById('app'))

TS:

const result = await client.query("SELECT * FROM products")
        const products = new Array()

        result.rows.map(p => {
            let obj: any = new Object()
            result.rowDescription.columns.map((el, i) => {
                obj[el.name] = p[i]
            })

            products.push(obj)
        })

        response.body = {
            success: true,
            data: products
        }

【问题讨论】:

  • 您确定您在正确的时间检查了类型吗?我建议在const allProducts = products.map((p) =&gt; ( 行上设置一个调试器断点并在程序在那里暂停时检查products 的值,或者在该行之前添加console.log("products:", products)
  • React.useState(0),以数字开头,您希望它是一个数组。什么?我的意思是useEffect 在渲染后做一些事情,你的fetch 是异步的,这就是为什么你的默认值很重要的两个原因?
  • 在您的测试中,您正在执行console.log(result.data.data),但随后您将result.data 传递给函数setProducts。您确定没有名为data 的嵌套变量,其中内部data 是产品数组。
  • 产品用数字(0)初始化,然后你分配了一个数组,所以它应该是const [products, setProducts] = React.useState([])

标签: javascript reactjs typescript api dictionary


【解决方案1】:

products 的初始状态是 0。这意味着当您第一次将它传递给Product 时,它将是一个数字,而不是一个数组。数字没有map 函数,所以你会得到一个错误。

如果products 将是一个数组,则使用[] 作为其初始状态:

const [products, setProducts] = React.useState([])
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^

...或像null 这样的标志值,您在尝试使用map 之前检查它。


旁注:您错误地使用了map。如果您没有从map 回调中返回值,并且没有使用map 创建的新数组,则不应使用map。使用forEach 或简单的循环。

【讨论】:

  • 是的。你是对的。由于某些原因,我的应用程序发生了一些事情。谢谢。
【解决方案2】:

你为什么不试试这个:

return (
        <div>
            <button onClick={() => heh()}>Click</button>
            {products.map((p) => (
        return (<div className="product" key={p.id}>
            <h3>{p.name} - {p.price}</h3>
            <p>{p.description}</p>
        </div>))}
        </div>
        
    )

【讨论】:

  • 同样的问题。我知道,这是我的第一选择:(
  • 按照其他人的建议设为const [products, setProducts] = React.useState([])
  • 您正在创建result.data.data 的console.log,但将result.data 存储在产品内部会导致问题吗?
【解决方案3】:

当你的heh函数执行时,产品列表已经被加载,它是一个数组。

const allProducts = ... 行出现错误,因为您将 products 的默认值设置为数字。在这一行

const [products, setProducts] = React.useState(0)

默认替换为空数组将解决您的问题:

const [products, setProducts] = React.useState([])

【讨论】:

    【解决方案4】:

    您收到错误是因为您使用 0 初始化 products 道具的状态,这不是可迭代对象。使用 useState([]) 对其进行初始化。

    【讨论】:

      【解决方案5】:

      当您输入问题标题时,您应该立即发现问题 -

      React .map 不是对象数组的函数

      认为你有一个对象数组。但是如果你没有.map 来调用它,那么你就没有数组。真的,就是这么简单。

      【讨论】:

      • 不!谁教你写这样的代码?您在两种方式中错误地使用了.map:1) 作为.forEach 和2) 作为.reduce。更合适的用法是response.body = { success: true, products: results.rows.map(row =&gt; result.rowDescription.columns.reduce((r, col, i) =&gt; Object.assign(r, { [col.name]: row[i] }), {}))
      猜你喜欢
      • 2021-04-29
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2021-08-03
      • 2018-01-11
      • 2021-01-10
      相关资源
      最近更新 更多