【发布时间】: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) => (行上设置一个调试器断点并在程序在那里暂停时检查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