【发布时间】:2020-11-15 23:51:47
【问题描述】:
我目前有一个父类 (App) 和一个子组件 (FoodItem)。 App 组件映射一个 FoodItem 组件列表。
每个单独的 FoodItem 组件都有一个称为 clickCount 的状态,每次用户单击它时都会递增。但是,我需要我的 App 组件中的重置按钮将地图中所有 FoodItem 组件的 FoodItem 状态重置为 0 onClick。
对此的任何帮助将不胜感激。
更新 - 我已经设法获得重置按钮来更新 FoodItem 子组件,但它只更新映射列表中的最后一项,而我要求它更新列表中的所有项目。
class App extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
this.state = {
foods: FoodCards,
calorieCount: 0,
vitaminACount: 0,
vitaminDCount: 0,
};
this.increment = this.increment.bind(this);
}
increment = (calories = 0, vitaminA = 0, vitaminD = 0) => {
this.setState({
calorieCount: Math.round(this.state.calorieCount + calories),
vitaminACount: Math.round((this.state.vitaminACount + vitaminA) * 100) / 100,
vitaminDCount: Math.round((this.state.vitaminDCount + vitaminD) * 100) / 100
});
};
resetCounters = () => {
this.myRef.current.resetClickCount();
this.setState({
calorieCount: 0,
vitaminACount: 0,
vitaminDCount: 0,
});
};
render() {
return (
<div className="App">
<main className="products-grid flex flex-wrap">
{this.state.foods.map((item, i) => {
return <FoodItem key={item.id} ref={this.myRef} name={item.name} img={item.img} calories={item.calories} vitamin_a={item.vitamin_a} vitamin_d={item.vitamin_d} updateTotals = {this.increment} />
})}
</main>
<footer>
<div className="reset" onClick={() => this.resetCounters()}>Reset</div>
</footer>
</div>
);
}
}
export default App;
class FoodItem extends React.Component {
constructor(props) {
super(props);
this.state = {
clickCount: 0
};
}
handleUpdateTotals = (calories, vitamin_a, vitamin_d) => {
this.props.updateTotals(calories, vitamin_a, vitamin_d);
this.clickIncrement();
}
clickIncrement = () => {
this.setState({
clickCount: this.state.clickCount + 1
});
}
resetClickCount = () => {
this.setState({
clickCount: 0
});
}
render() {
return (
<div className="product" onClick={() => this.handleUpdateTotals(this.props.calories, this.props.vitamin_a, this.props.vitamin_d)}>
<p>{this.props.name}</p>
{this.state.clickCount > 0 ? <p>Selected: {this.state.clickCount}</p> : <p>Not Selected</p>}
<img src={this.props.img} alt="" />
</div>
);
}
}
【问题讨论】:
-
在 FoodItem 中引入一个属性,例如“reset”,当单击“Reste”按钮时,将属性值作为“reset”的 true 传递。如果 props.reset===true,在 FoodItem 组件中将 clickCount 设置为 0。
-
您应该提升状态并将点击计数保留在您的父组件中。 reactjs.org/docs/lifting-state-up.html
标签: javascript reactjs