javascript - FCC Drum Machine - 通过测试但 keydown 事件没有为我触发
问题描述
我从 FCC 那里得到了 cdn 脚本,说所有测试都通过了,但是当我尝试按下按键来运行调用音频剪辑播放的函数时,什么也没有发生 - 我在这里遗漏了什么吗?
按键组件
import React from "react";
import { data } from "./sounds";
export default function Key(props) {
const soundId = props.soundId;
const play = () => {
document.getElementById(props.id).play();
console.log(`'Clicked:' ${props.id}`);
};
const displayData = props.displayData;
const handleClick = () => {
play();
displayData(props.id);
};
return (
<div className="buttonContainer" >
<button id="button" className="drum-pad" onClick={handleClick} onKeyDown={handleClick}>
<audio
src={data[soundId].url}
type="audio/mp3"
className="clip"
id={props.id}
/>
{props.id.toUpperCase()}
</button>
</div>
);
}
应用组件
import React, { useState } from "react";
import Key from "./Key";
import "./styles.css";
export default function App() {
const [displayData, setDisplayData] = useState();
const handleDisplay = input => {
setDisplayData(input);
setTimeout(() => {
setDisplayData();
}, 500);
};
return (
<div className="App">
<div id="drum-machine">
<p id="display">{displayData}</p>
<Key id={"Q"} soundId={0} charCode={81} displayData={handleDisplay} />
<Key id={"W"} soundId={1} charCode={87} displayData={handleDisplay} />
<Key id={"E"} soundId={2} charCode={69} displayData={handleDisplay} />
<Key id={"A"} soundId={3} charCode={65} displayData={handleDisplay} />
<Key id={"S"} soundId={4} charCode={83} displayData={handleDisplay} />
<Key id={"D"} soundId={5} charCode={68} displayData={handleDisplay} />
<Key id={"Z"} soundId={6} charCode={90} displayData={handleDisplay} />
<Key id={"X"} soundId={7} charCode={88} displayData={handleDisplay} />
<Key id={"C"} soundId={8} charCode={87} displayData={handleDisplay} />
</div>
</div>
);
}
Codesandbox 链接:https ://codesandbox.io/s/fcc-drum-kit-dz81w
解决方案
您需要使用 componentDidMount() 告诉浏览器在页面呈现后侦听 onKeydown 事件
componentDidMount() {
document.addEventListener("onKeydown", this.handleKeyPress);
}
componentWillUnmount() {
document.removeEventListener("onKeydown", this.handleKeyPress);
}
或者将您的按钮事件更改为onKeydown()
事件,小写d
推荐阅读
- scala - 将正在构造的实例传递给案例类构造函数
- javascript - Hyperledger Fabric 2.0 示例节点 SDK
- cron - CRON 表达式在每个月的 9 号开始,不包括周末
- php - laravel 多文件日志查看器使用 laravel Log-Viewer
- django - NOT NULL 约束失败:users_profile.usertype
- r - 计算字符串变量中的对数
- android - 如何使用底部对话框片段中的 viewpager 从片段发送数据?
- android-studio - 在 Flutter 项目中编辑哪个 AndroidManifest.xml?
- oracle - Oracle 中针对索引组织表的 CTAS 查询
- javascript - 将字符串数组转换为对象数组