Я пытаюсь заставить эту функцию запускаться при вызове клика в дочернем компоненте.
getTotalOfItems = () => {
console.log('anything at all?')
if (this.props.cart === undefined || this.props.cart.length == 0) {
return 0
} else {
const items = this.props.cart
var totalPrice = items.reduce(function (accumulator, item) {
return accumulator + item.price;
}, 0);
this.setState({
estimatedTotal: totalPrice
});
};
}
Этот щелчок запускается из компонента корзины
<button onClick={() => {props.addToCart(item); props.getPrice.bind(this)} }>+</button>
Компонент корзины добавляется здесь к компоненту ItemDetails
export default class ItemDetails extends Component {
constructor(props) {
super(props);
this.state = {
open: false
};
}
render() {
return(
<div>
<Button
className="item-details-button"
bsStyle="link"
onClick={() => this.setState({open: !this.state.open})}
>
{this.state.open === false ? `See` : `Hide`} item details
{this.state.open === false ? ` +` : ` -`}
</Button>
<Collapse in={this.state.open}>
<Cart
getPrice={this.props.getPrice}
/>
</Collapse>
</div>
)
}
}
Наконец, компонент ItemDetails добавляется в app.js примерно так:
render() {
return (
<div className="container">
<Col md={9} className="items">
<ProductListing products={this.props.initialitems} />
</Col>
<Col md={3} className="purchase-card">
<SubTotal price={this.state.total.toFixed(2)} />
<hr />
<EstimatedTotal
price={this.state.estimatedTotal.toFixed(2)} />
<ItemDetails
price={this.state.estimatedTotal.toFixed(2)}
getPrice={ () => this.getTotalOfItems() }
/>
<hr />
<PromoCodeDiscount
giveDiscount={ () => this.giveDiscountHandler() }
isDisabled={this.state.disablePromoButton}
/>
</Col>
</div>
);
};
Если я удаляю () => перед this.getTotalOfItems (), он запускает функцию onClick, однако вызывает бесконечный цикл повторного рендеринга приложения, что приводит к ошибке.
Есть ли способ исправить это? Я новичок в React, и это один из моих первых проектов, использующих его. Любой совет должен быть оценен.
Извините, если это не объясняется, я с радостью предоставлю любую дополнительную информацию, если потребуется.
Спасибо!