У вас есть 2 решения.
Вы можете либо сделать ColorBox
компонентом Statefull, который будет сам управлять цветом, который он имеет.
Или сохранить каждый цвет для каждой строки в отдельномгосударственное значение.Я реализовал второе решение в приведенном ниже коде.
ColorBox
теперь является компонентом без состояния, который получит свой текущий цвет и функцию обработчика в своих подпорках.Функция обработчика будет украшена индексом, которым она должна установить правильное значение в вашем состоянии.
Используя вычисленные свойства, вы теперь можете динамически устанавливать правильное значение в вашем состоянии:
handleChange = index => event => {
this.setState({
[index]: event.target.value
});
}
Полностью рабочий пример:
class Applet extends React.Component {
constructor(props) {
super(props);
this.state = { };
}
handleChange = index => event => {
this.setState({
[index]: event.target.value
});
}
render() {
let rows = [];
for (let i = 0; i < 10; i++) {
rows.push(<ColorBox colorSelected={this.handleChange(i)} color={this.state[i]}/>);
}
return (
<div className="whatthe">
{rows}
</div>
);
}
}
const ColorBox = ({ colorSelected, color }) => {
return (
<div className="row">
<div className="col-sm" style={{ 'background-color': color }}>
<label>
<input type="radio" name="color_r" value="red" checked={color === 'red'} onChange={colorSelected} /> R
</label>
<label>
<input type="radio" name="color_g" value="green" checked={color === 'green'} onChange={colorSelected} /> G
</label>
<label>
<input type="radio" name="color_b" value="blue" checked={color === 'blue'} onChange={colorSelected} /> B
</label>
</div>
<div className="col-sm" >
I am {color}
</div>
</div>
);
};
ReactDOM.render(
<Applet />,
document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.0/umd/react-dom.production.min.js"></script>
<div id='root'>
Вам также нужно назначить переключателям различные id
с в зависимости от их группы, чтобы избежать проблем с рендерингом