{this.state.shoppingLists2.map((shoppingList, index)=>(
<ShoppingList2
key={index}
value={this.onUpdate}
/>
))}
Здесь вы используете несколько компонентов списка покупок, но воспроизводите только тот, который вы импортировали. Вместо этого используйте этот
{this.state.shoppingLists2.map((ShoppingList, index)=>(
<ShoppingList
key={index}
value={this.onUpdate}
/>
))}
Следующая проблема заключается в том, что вы отправляете значения (суммы) из вашего дочернего компонента. И суммирование сумм, когда вы должны суммировать отдельные числа в соответствии с вашим кодом.
Я немного изменил твой код. И сохраняется значение (сумма) согласно индексу компонента. И, наконец, суммировал их за
вот полный компонент
import React from "react";
import ReactDOM from "react-dom";
import styled from "styled-components";
import ShoppingList2 from "./ShoppingList2";
const Container = styled.div`
position: absolute;
left: 0;
bottom: 0;
right: 0;
display: flex;
flex-direction: row;
justify-content: space-between;
`;
class TotalPrice extends React.Component {
state = {
shoppingLists2: [ShoppingList2],
shoplistsums: {},
sum: 0
};
AddShoppingList = () => {
let shoppingLists2 = this.state.shoppingLists2.concat(ShoppingList2);
this.setState({
shoppingLists2
});
console.log(this.state.shoppingLists2);
};
onUpdate = index => val => { // changed here
console.log("val", val);
let shoplistsums = { // and here
...this.state.shoplistsums,
[index]: val
};
console.log("shpl", shoplistsums);
// and this block, using reduce would do as well, but I like this method better
let sum = 0;
Object.keys(shoplistsums).forEach(key => {
sum += shoplistsums[key];
});
this.setState({
shoplistsums,
sum
});
};
render() {
return (
<div>
{this.state.shoppingLists2.map((ShoppingList, index) => (
<ShoppingList key={index} value={this.onUpdate(index)} /> /* changed here */
))}
<Container>
<label>Total:</label>
<label>{this.state.sum + " €"}</label>
<button onClick={this.AddShoppingList}>Add Receipt</button>
</Container>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<TotalPrice />, rootElement);