Вы можете прикрепить onKeyDown
к контейнеру и получить нажатую клавишу и использовать это для установки некоторого состояния для переключения класса boostrap .active
вручную.
(Я переработал ваш компонент a бит, чтобы упростить работу)
class DrumPad extends React.Component {
constructor(props) {
super(props);
this.state = { activeButton: "" };
this.buttons = [["Q", "W", "E"], ["A", "S", "D"], ["Z", "X", "C"]];
}
onKeyDown = e => {
this.setState({ activeButton: e.key.toUpperCase() });
};
onMouseDown = buttonId => {
this.setState({ activeButton: buttonId });
};
render() {
const { activeButton } = this.state;
return (
<div className="container-fluid d-flex" onKeyDown={this.onKeyDown}>
<div>
{this.buttons.map(buttonRow => (
<div className="row-sm-4">
<div class="btn-group-toggle">
{buttonRow.map(buttonId => (
<button
id={buttonId}
key={buttonId}
className={`btn btn-lg btn-dark ${
activeButton === buttonId ? "active" : ""
}`}
onMouseDown={() => this.onMouseDown(buttonId)}
>
{buttonId}
</button>
))}
</div>
</div>
))}
</div>
</div>
);
}
}
Мне также пришлось немного поиграть со стилями bootstrap:
.btn {
margin: 3px;
}
.btn-group-toggle button.btn.btn-dark:focus,
.btn-group-toggle button.btn.btn-dark:active {
box-shadow: none;
}
button.active {
box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
}
Обновлен код здесь