【发布时间】:2021-09-21 02:15:54
【问题描述】:
我要回到去年开发的幻灯片应用。我已经设置了 prevSlide 和 nextSlide 功能,所以 trigger upon button press 但我也想支持箭头键导航(未来可能还有移动屏幕滑动功能)。
我设置了 ComponentDidMount/ComponentDidUnmount 函数来为我的 handleKeyDown 事件处理程序注册 keyDown 支持,并且我的 handleKeyDownRight 事件处理程序在我触发alert text 时工作。不幸的是,如果我尝试从 handleKeyDownRight 函数中调用 nextSlide 函数,React 会抛出 following error: "TypeError: this.nextSlide is not a function"。
我可以做哪些调整让 handleKeyDownRight 触发 nextSlide() 就像按下“下一步”按钮一样?
import React, {Component} from 'react';
import '../Cantiche.scss';
import Card from '../Card/Card';
import data from '../../../data/data';
class Inferno extends Component {
state = {
book: data.inferno,
slide: data.inferno[0]
}
componentDidMount = () => {
window.addEventListener('keydown', this.handleKeyDownRight);
}
prevSlide = () => {
const newIndex = this.state.slide.index-1;
this.setState({
slide: data.inferno[newIndex]
})
}
nextSlide = () => {
const newIndex = this.state.slide.index+1;
this.setState({
slide: data.inferno[newIndex]
})
}
handleKeyDownRight(event) {
if(event.keyCode === 39){
alert('Right arrow key');
this.nextSlide(); //Throws error: "TypeError: this.nextSlide is not a function"
}
}
componentWillUnmount = () => {
window.addEventListener('keydown', this.handleKeyDownRight);
}
render () {
const {slide} = this.state;
let cards = (
<div className={`cards-slider active-slide-${slide.index}`} >
<div className="cards-slider-wrapper" style={{
'transform': `translateX(-${slide.index*(100/this.state.book.length)}%)`
}}>
{
this.state.book.map(slide => <Card key={slide._id} slide={slide} />)
}
</div>
</div>
)
return (
<div className="card-container">
<h1>Inferno</h1>
<div className="buttons" onKeyDown={this.handleKeyDownRight}>
<button
onClick={() => this.prevSlide()}
disabled={slide.index === 0}
>Prev</button>
<button
onClick={() => this.nextSlide()}
disabled={slide.index === data.inferno.length-1}
>Next</button>
</div>
{cards}
</div>
);
}
}
export default Inferno;
【问题讨论】:
标签: reactjs function typeerror addeventlistener onkeydown