Что вы можете сделать, это поднять состояние и сообщить вашему компоненту Values
в своем собственном состоянии, какое число выбрано каждым из ваших выборов.
class Values extends React.Component {
constructor() {
super();
this.state = {
values: [
{
name: "A",
selected: 0, // The selected number for this select will be held in memory here
numbers: [
{
number: 30
},
{
number: 40
},
{
number: 50
}
]
},
{
name: "B",
selected: 0, // The selected number for this select will be held in memory here
numbers: [
{
number: 20
},
{
number: 30
}
]
}
]
};
}
// Rest of your component
}
Затем вам нужно передать вашему компоненту Numbers
способ изменить состояние Values
; например, вы можете передать метод, который изменит состояние вашего Values
компонента.
class Values extends React.Component {
// Code...
// This will be passed down to Number component in the render method
selectNumber = (name, number) => {
this.setState({
values: this.state.values.map((value => {
if (value.name === name) {
return {
...value,
selected: number
}
}
return value;
}))
})
}
render() {
const { values } = this.state;
return (
<div>
// WE PASS IT DOWN HERE
{values.map(value => (
<Numbers
key={value.name}
value={value}
onSelect={(number) => this.selectNumber(value.name, number)}
/>
))}
<h1>sum: {sum}</h1>
</div>
);
}
}
Наконец, в вашей функции рендеринга Values
вам нужно сложить все выбранные числа каждого из ваших выборов, которые живут в вашем штате, и отобразить их.
class Values extends React.Component {
// Code ...
render() {
const { values } = this.state;
const sum = values.reduce((acc, val) => acc + val.selected, 0) // We make the sum
return (
<div>
{values.map(value => (
<Numbers
key={value.name}
value={value}
onSelect={(number) => this.selectNumber(value.name, number)}
/>
))}
<h1>sum: {sum}</h1> {/* Display the sum */}
</div>
);
}
}
Вот рабочий код, который я сделал, настроив ваш код.