Так что сейчас у меня в приложении React происходит невероятно странное явление, и я не совсем уверен, как его описать, но здесь идет речь:
Я создаю синтезатор с помощью Интернета.Аудио API и React, которые реагируют на события keyDown
, чтобы инициировать начало заметки, и события keyUp
, чтобы инициировать конец заметки.В большинстве случаев это работает безупречно.Но одно нажатие клавиши каждые 10-15 приводит к дополнительному запуску события keyDown
после события keyUp
.У меня есть компонент React, который обрабатывает все события и запускает действия Redux в зависимости от обрабатываемого события (keyUp
или keyDown
).Кроме того, я использую метод lodash/debounce
для подавления дополнительных событий keyDown
, когда пользователь удерживает клавишу.
Я не подключен к функции lodash/debounce
, мне просто нужно что-то, чтобы подавитьдополнительные keyDown
события.Вполне возможно, что я не правильно его использую или что есть более простое решениеМне просто нужны ответы.
Мой компонент выглядит следующим образом:
import React, { Component } from 'react'
import debounce from 'lodash/debounce'
import { REGISTERED_KEYS } from '../constants/keyboard-constants'
export default class ComputerKeyboard extends Component {
constructor (props) {
super(props)
this.handleKeyDown = this.handleKeyDown.bind(this)
this.handleKeyUp = this.handleKeyUp.bind(this)
}
handleKeyDown (e) {
return debounce((event = e) => {
if (this.props.currentKeys.indexOf(event.keyCode) < 0 && REGISTERED_KEYS.includes(event.keyCode)) {
this.props.keyDown(event.keyCode)
this.props.updateGateStartTime({ value: this.props.audioContext.currentTime })
}
}, 2)()
}
handleKeyUp (e) {
const isLastKey = this.props.currentKeys.includes(e.keyCode) && this.props.currentKeys.length === 1
if (isLastKey && this.props.gateStartTime) {
this.props.updateGateStartTime({ value: null })
}
if (this.props.currentKeys.includes(e.keyCode) && REGISTERED_KEYS.includes(e.keyCode)) {
this.props.keyUp(e.keyCode)
}
}
componentDidMount () {
document.addEventListener('keydown', this.handleKeyDown)
document.addEventListener('keyup', this.handleKeyUp)
}
componentWillUnmount () {
document.removeEventListener('keydown', this.handleKeyDown)
document.removeEventListener('keyup', this.handleKeyUp)
}
render () {
return null
}
}