【发布时间】:2021-10-12 13:26:34
【问题描述】:
我正在尝试在 NextJS 应用程序中播放音频,并且正在使用 TypeScript 编写代码。
我的onClick() 在开发环境中工作得非常好,这意味着当我做npm run dev 时。
<button onClick ={toggle}> {playing ? "Pause" : "Play"</button>
但是当我尝试做npm build 时,我收到了这个错误:
输入错误:输入'boolean | (() => void)' 不可分配给类型 'MouseEventHandler |不明确的'。 类型 'false' 不可分配给类型 'MouseEventHandler |未定义'。
在阅读了一堆关于 Stack Overflow 的问题后,我发现 onClick() 不期望 void 是 toggle 函数在这种情况下返回的,所以我做了:
<button onClick={() => toggle}> {playing ? "Pause" :"Play</button>
上述更改后,分配错误消失了,但是当我运行应用程序时,播放按钮不再起作用。 我愿意接受您对代码的任何其他建议。
这里是完整的代码:
const useAudio = (url: string) => {
const audio = useRef<HTMLAudioElement | undefined>(
typeof Audio !== "undefined" ? new Audio(url) : undefined
);
const [playing, setPlaying] = useState(false);
const toggle = () => setPlaying(!playing);
//const toggle = setPlaying(!playing);
useEffect(() => {
playing ? audio.current?.play() : audio.current?.pause();
}, [playing]);
useEffect(() => {
audio.current?.addEventListener('ended', () => setPlaying(false));
return () => {
audio.current?.removeEventListener('ended', () => setPlaying(false));
};
}, []);
return [playing, toggle];
};
const NFT = ({ baseUri, metaId, url }: { baseUri: string; metaId: string; url: string }) => {
const [metadata, setMetadata] = useState<{[key: string]: string} | null>(null)
const fetchMetadata = async (url: string) => {
const response = await fetch(url)
const result = await response.json()
if (!result) return
setMetadata(result)
}
if(url) {
var [playing, toggle] = useAudio(url);
}
useEffect(() => {
fetchMetadata(`${baseUri}/${metaId}`)
}, [])
if (!metadata) return null
return (
<div className="w-full md:w-1/2 lg:w-1/3 p-3 mb-4">
<div className="h-96">
<div className="relative items-center min-h-full">
<a href="#">
<Image
alt={metadata[MetadataField.Title]}
src={metadata[MetadataField.Media]}
layout="fill"
objectFit="contain"
/>
</a>
</div>
{url &&
<button onClick ={toggle}> {playing ? "Pause" : "Play"} </button>
}
</div>
</div>
)
}
【问题讨论】:
-
与您的类型错误没有直接关系,但您不应该有条件地调用您的自定义
useAudio钩子,这违反了 Rules of Hooks。
标签: reactjs typescript react-hooks onclick next.js