组件中的 React-Map 功能不起作用
React- Map function in component doesn't work
我正在使用一个小型应用程序,我正在其中使用 react.js。由于我是初学者,因此我遇到了一些问题。
我想映射我的阵列,但它不起作用。我遵循了一个 youtube 教程,不同之处在于该数组填充了硬编码数据。我正在获取数据并在获取完成后将其添加到数组中。 (JSON 个对象)。
import React from "react";
import Product from "./Product"
export default class ProductList extends React.Component{
render()
{ console.log("productlist")
return (
<ul>
{this.props.products.map((product, i) =>
{ return <Product product={product} key={i}/> })}
{console.log("test")}
</ul>
)
}
}
console.logs 有效,但映射函数无效。我尝试过不使用 Id,并以不同的方式尝试过,但它行不通。我希望数据传递到我的最后一个组件,称为 Product。有我想要填充的
元素。
当我刚刚将 "this.props.products" 传递给 "" 时,我到达了 Product 组件,但没有填充数据。
从 "react";
导入 React
export default class Product extends React.Component{
render(){
console.log("product")
return (
<li> {this.props.product.title} {this.props.product.price} <img src={this.props.product.imageUrl}/> </li>
)
}
}
我正在使用获取方法从 Json 文件中获取数据。
fetch('http://localhost:8080/products')
.then(
response =>
response.ok
? response.json()
: Promise.reject(Can't communicate with REST API server (${response.statusText})`),
)
.then(products => {
products.forEach(product => productArray.push(product));
})
正如您在上面看到的,我将 Json 文件中的产品添加到我创建的数组中。而且我不确定这是否是导致我出现问题的原因。
import React from "react";
import ReactDOM from "react-dom";
import Container from "./Components/Container";
let productArray = [];
const app = document.getElementById('app');
ReactDOM.render(<Container products={productArray}/>, app)
我正在使用 ReactDOM.render 将我的数组传递到我的 Container.js 文件中。
在 Container.js 文件中,我还有 import React from react 和 import ProductList from ./Productlist。所以我继续传递数组(我检查了它是否有值,并且有。
<ProductList products = {this.props.products}/>
@MissAndersson 你在哪里调用你的 fetch 函数?
如果您在 React 组件之外调用 fetch 函数,那可能就是问题所在。您的 React 组件未正确重新呈现。
只要 React 组件的状态或 props 发生变化,它们就会重新渲染。请参阅此 CodeSandbox 示例。 (https://codesandbox.io/s/812yv7wjrl)
我的获取函数更新了组件的状态,这会强制重新渲染。
这是因为 products
在您的 fetch
请求完成时已过时。即使您正在 更新 它(通过 productArray.push
),您的组件也不知道此类更改。更不用说这是一个糟糕的模式。
为此,使用适当的 React 组件 lifecycle methods and state 处理。
在您的 Container
组件中:
const Container extends React.Component {
constructor(props) {
super(props)
this.state = {
products: [], // Initialize product as an empty array
}
}
componentDidMount() {
fetch('http://localhost:8080/products')
.then(response =>
response.ok
? response.json()
: Promise.reject(`Can't communicate with REST API server (${response.statusText})`),
)
.then(products => {
this.setState({ products }) // Notify your component that products have been fetched
})
}
render() {
return (
<div>
...
<ProductList products={this.state.products} />
</div>
)
}
}
请注意setState
may be asynchronous。如果您将来获取新数据,请毫不犹豫地使用@Luke M Willis 指出的此类功能:
this.setState(prevState => ({
products: [ ...prevState.products, ...products ],
}))
我正在使用一个小型应用程序,我正在其中使用 react.js。由于我是初学者,因此我遇到了一些问题。
我想映射我的阵列,但它不起作用。我遵循了一个 youtube 教程,不同之处在于该数组填充了硬编码数据。我正在获取数据并在获取完成后将其添加到数组中。 (JSON 个对象)。
import React from "react";
import Product from "./Product"
export default class ProductList extends React.Component{
render()
{ console.log("productlist")
return (
<ul>
{this.props.products.map((product, i) =>
{ return <Product product={product} key={i}/> })}
{console.log("test")}
</ul>
)
}
}
console.logs 有效,但映射函数无效。我尝试过不使用 Id,并以不同的方式尝试过,但它行不通。我希望数据传递到我的最后一个组件,称为 Product。有我想要填充的
当我刚刚将 "this.props.products" 传递给 "" 时,我到达了 Product 组件,但没有填充数据。 从 "react";
导入 Reactexport default class Product extends React.Component{
render(){
console.log("product")
return (
<li> {this.props.product.title} {this.props.product.price} <img src={this.props.product.imageUrl}/> </li>
)
}
}
我正在使用获取方法从 Json 文件中获取数据。
fetch('http://localhost:8080/products')
.then(
response =>
response.ok
? response.json()
: Promise.reject(Can't communicate with REST API server (${response.statusText})`),
)
.then(products => {
products.forEach(product => productArray.push(product));
})
正如您在上面看到的,我将 Json 文件中的产品添加到我创建的数组中。而且我不确定这是否是导致我出现问题的原因。
import React from "react";
import ReactDOM from "react-dom";
import Container from "./Components/Container";
let productArray = [];
const app = document.getElementById('app');
ReactDOM.render(<Container products={productArray}/>, app)
我正在使用 ReactDOM.render 将我的数组传递到我的 Container.js 文件中。 在 Container.js 文件中,我还有 import React from react 和 import ProductList from ./Productlist。所以我继续传递数组(我检查了它是否有值,并且有。
<ProductList products = {this.props.products}/>
@MissAndersson 你在哪里调用你的 fetch 函数?
如果您在 React 组件之外调用 fetch 函数,那可能就是问题所在。您的 React 组件未正确重新呈现。
只要 React 组件的状态或 props 发生变化,它们就会重新渲染。请参阅此 CodeSandbox 示例。 (https://codesandbox.io/s/812yv7wjrl)
我的获取函数更新了组件的状态,这会强制重新渲染。
这是因为 products
在您的 fetch
请求完成时已过时。即使您正在 更新 它(通过 productArray.push
),您的组件也不知道此类更改。更不用说这是一个糟糕的模式。
为此,使用适当的 React 组件 lifecycle methods and state 处理。
在您的 Container
组件中:
const Container extends React.Component {
constructor(props) {
super(props)
this.state = {
products: [], // Initialize product as an empty array
}
}
componentDidMount() {
fetch('http://localhost:8080/products')
.then(response =>
response.ok
? response.json()
: Promise.reject(`Can't communicate with REST API server (${response.statusText})`),
)
.then(products => {
this.setState({ products }) // Notify your component that products have been fetched
})
}
render() {
return (
<div>
...
<ProductList products={this.state.products} />
</div>
)
}
}
请注意setState
may be asynchronous。如果您将来获取新数据,请毫不犹豫地使用@Luke M Willis 指出的此类功能:
this.setState(prevState => ({
products: [ ...prevState.products, ...products ],
}))