React 组件不会显示函数的 return
React component wont display the return of a function
我有一个组件应该显示 "cards",其中包含保存在状态数组中的信息。我从 JSON 文件中获取此信息并将其保存到我的 "componentDidMount" 数组中。然后我在渲染函数的 return 之前创建了一个名为 "displayFood" 的函数,然后我在我的渲染函数 return 中使用它。问题是当我 运行 代码时没有显示卡片。
import React from 'react'
import "./style.scss";
import FoodData from "./foodData.json";
class Food extends React.Component {
constructor(props){
super(props);
this.state={
foodData: []
}
}
componentDidMount(){
FoodData.map((foodItem,index) => {
var foodTemp = {
id: index,
name: foodItem.name,
pic: foodItem.pic,
serving: foodItem.serving,
calories: foodItem.calories,
sugar: foodItem.sugar,
protien: foodItem.protien
}
this.setState((prevState) => {
prevState.foodData.push(foodTemp)
})
})
}
render() {
const displayFood = () => {
var i;
for(i = 0; i < this.state.foodData.length; i++){
return(
<div className="food-card">
<img src={require(`${this.state.foodData[i].pic}`)}/>
<ul>
<li>{this.state.foodData[i].name}</li>
<li>Serving: {this.state.foodData[i].serving}</li>
<li>Calories: {this.state.foodData[i].calories}</li>
<li>Sugar: {this.state.foodData[i].sugar}</li>
<li>Protien: {this.state.foodData[i].protien}</li>
</ul>
<button name={this.state.foodData[i].name}>Add</button>
</div>
)
}
}
return(
<div>
<div className="food-container">
{
displayFood()
}
</div>
</div>
)
}
}
export default Food;
根据生命周期,render
方法实际上已经在componentDidMount
之前被调用了。因此,在渲染时,数据仍然是空的。为什么不在componentWillMount
中移动数据初始化?
尝试更改以前的状态...您直接使用状态上的数据,它不会更改状态根:
this.setState((prevState) => ({
...prevState,
foodData: [ ...foodData, foodTemp ],
}))
首先,我不确定您的 setState
在 componentDidMount
工作。如果你不想 return 一个新数组,你不应该使用 map
,而是使用 forEach
。而且你正在直接改变状态,这是不推荐的。该函数应如下所示:
componentDidMount(){
// Build a new array of object from FoodData
const newFoodData =
FoodData.map(({name, pic, serving, calories, sugar, protien }, index) =>
({ id: index, name, pic, serving, calories, sugar, protien }))
// Assign the new object to state
this.setState({ foodData: newFoodData })
}
其次,for
循环中的 return
将仅 return 第一项。您应该创建一个数组,然后将项目推入循环而不是 return
const displayFood = () => {
let cards = [] // Crate an array
for(let i = 0; i < this.state.foodData.length; i++){
cards.push( // push item to array through the loop
<div className="food-card">
<img src={require(`${this.state.foodData[i].pic}`)}/>
<ul>
<li>{this.state.foodData[i].name}</li>
<li>Serving: {this.state.foodData[i].serving}</li>
<li>Calories: {this.state.foodData[i].calories}</li>
<li>Sugar: {this.state.foodData[i].sugar}</li>
<li>Protien: {this.state.foodData[i].protien}</li>
</ul>
<button name={this.state.foodData[i].name}>Add</button>
</div>
)
}
return cards // Return the array
}
我建议您将 displayFood
移到 render()
函数之外。因为当其他事情导致重新渲染而不是 this.state.foodData
更改时,组件必须重新构建 displayFood()
。浪费了。
class Hello extends React.Component {
constructor(props){
super(props);
this.state={
foodData: []
}
}
componentDidMount(){
const { foodData } = this.state;
foodData.push({
id: 0,
name: 'beans',
pic: 'picurl',
serving: '2',
calories: '100',
sugar: '30',
protien: '10'
});
this.setState({ foodData });
}
render() {
return <div>
<div className="food-container">
{
this.state.foodData.map((item,key) => {
return <div className="food-card">
{`${item.pic}`}
<ul>
<li>{item.name}</li>
<li>Serving: {item.serving}</li>
<li>Calories: {item.calories}</li>
<li>Sugar: {item.sugar}</li>
<li>Protien: {item.protien}</li>
</ul>
<button name={item.name}>Add</button>
</div>
})
}
</div>
</div>;
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
确保您的 foodData 在 'componentDidMount()'
上正确加载
我有一个组件应该显示 "cards",其中包含保存在状态数组中的信息。我从 JSON 文件中获取此信息并将其保存到我的 "componentDidMount" 数组中。然后我在渲染函数的 return 之前创建了一个名为 "displayFood" 的函数,然后我在我的渲染函数 return 中使用它。问题是当我 运行 代码时没有显示卡片。
import React from 'react'
import "./style.scss";
import FoodData from "./foodData.json";
class Food extends React.Component {
constructor(props){
super(props);
this.state={
foodData: []
}
}
componentDidMount(){
FoodData.map((foodItem,index) => {
var foodTemp = {
id: index,
name: foodItem.name,
pic: foodItem.pic,
serving: foodItem.serving,
calories: foodItem.calories,
sugar: foodItem.sugar,
protien: foodItem.protien
}
this.setState((prevState) => {
prevState.foodData.push(foodTemp)
})
})
}
render() {
const displayFood = () => {
var i;
for(i = 0; i < this.state.foodData.length; i++){
return(
<div className="food-card">
<img src={require(`${this.state.foodData[i].pic}`)}/>
<ul>
<li>{this.state.foodData[i].name}</li>
<li>Serving: {this.state.foodData[i].serving}</li>
<li>Calories: {this.state.foodData[i].calories}</li>
<li>Sugar: {this.state.foodData[i].sugar}</li>
<li>Protien: {this.state.foodData[i].protien}</li>
</ul>
<button name={this.state.foodData[i].name}>Add</button>
</div>
)
}
}
return(
<div>
<div className="food-container">
{
displayFood()
}
</div>
</div>
)
}
}
export default Food;
根据生命周期,render
方法实际上已经在componentDidMount
之前被调用了。因此,在渲染时,数据仍然是空的。为什么不在componentWillMount
中移动数据初始化?
尝试更改以前的状态...您直接使用状态上的数据,它不会更改状态根:
this.setState((prevState) => ({
...prevState,
foodData: [ ...foodData, foodTemp ],
}))
首先,我不确定您的 setState
在 componentDidMount
工作。如果你不想 return 一个新数组,你不应该使用 map
,而是使用 forEach
。而且你正在直接改变状态,这是不推荐的。该函数应如下所示:
componentDidMount(){
// Build a new array of object from FoodData
const newFoodData =
FoodData.map(({name, pic, serving, calories, sugar, protien }, index) =>
({ id: index, name, pic, serving, calories, sugar, protien }))
// Assign the new object to state
this.setState({ foodData: newFoodData })
}
其次,for
循环中的 return
将仅 return 第一项。您应该创建一个数组,然后将项目推入循环而不是 return
const displayFood = () => {
let cards = [] // Crate an array
for(let i = 0; i < this.state.foodData.length; i++){
cards.push( // push item to array through the loop
<div className="food-card">
<img src={require(`${this.state.foodData[i].pic}`)}/>
<ul>
<li>{this.state.foodData[i].name}</li>
<li>Serving: {this.state.foodData[i].serving}</li>
<li>Calories: {this.state.foodData[i].calories}</li>
<li>Sugar: {this.state.foodData[i].sugar}</li>
<li>Protien: {this.state.foodData[i].protien}</li>
</ul>
<button name={this.state.foodData[i].name}>Add</button>
</div>
)
}
return cards // Return the array
}
我建议您将 displayFood
移到 render()
函数之外。因为当其他事情导致重新渲染而不是 this.state.foodData
更改时,组件必须重新构建 displayFood()
。浪费了。
class Hello extends React.Component {
constructor(props){
super(props);
this.state={
foodData: []
}
}
componentDidMount(){
const { foodData } = this.state;
foodData.push({
id: 0,
name: 'beans',
pic: 'picurl',
serving: '2',
calories: '100',
sugar: '30',
protien: '10'
});
this.setState({ foodData });
}
render() {
return <div>
<div className="food-container">
{
this.state.foodData.map((item,key) => {
return <div className="food-card">
{`${item.pic}`}
<ul>
<li>{item.name}</li>
<li>Serving: {item.serving}</li>
<li>Calories: {item.calories}</li>
<li>Sugar: {item.sugar}</li>
<li>Protien: {item.protien}</li>
</ul>
<button name={item.name}>Add</button>
</div>
})
}
</div>
</div>;
}
}
ReactDOM.render(
<Hello />,
document.getElementById('container')
);
确保您的 foodData 在 'componentDidMount()'
上正确加载