前提・実現したいこと
Reactを用いてのオーディオプレイヤーの作成
発生している問題・エラーメッセージ
ボタンクリックでtogglingという関数を呼び出しているが、togglingが実行されず、playingの値が変更されないため、際レンダリングされずにAudioが再生されない。
該当のソースコード
audio
1const url = "http://www.ne.jp/asahi/music/myuu/wave/hana.mp3"; 2 const useAudio = (url: string) => { 3 const [audio] = useState(new Audio(url)); 4 console.log(audio); 5 const [playing, setPlaying] = useState(false); 6 const toggling = useCallback(e => { 7 setPlaying(!playing); 8 console.log(playing); 9 }, []); 10 11 useEffect(() => { 12 playing ? audio.play() : audio.pause(); 13 }, [playing]); 14 15 useEffect(() => { 16 audio.addEventListener("ended", () => setPlaying(false)); 17 return () => { 18 audio.removeEventListener("ended", () => setPlaying(false)); 19 }; 20 }, []); 21 22 return [playing, toggling]; 23 }; 24 const [playing, toggling] = useAudio(url); 25
audioPlayerProps: { buttonPlayProps: { buttonType: 2, onClickAction: () => { toggling; }, label: playing ? "Pause" : "Play" } }
###試したこと
const url = "http://www.ne.jp/asahi/music/myuu/wave/hana.mp3"; const useAudio = (url: string) => { const [audio] = useState(new Audio(url)); const [playing, setPlaying] = useState(false); const toggling = useCallback( e => { setPlaying(!playing); console.log(playing); }, [playing] ); useEffect(() => { playing ? audio.play() : audio.pause(); }, [playing]); useEffect(() => { audio.addEventListener("ended", () => setPlaying(false)); return () => { audio.removeEventListener("ended", () => setPlaying(false)); }; }, []); return [playing, toggling]; }; const [playing, toggling] = useAudio(url);
audioPlayerProps: { buttonPlayProps: { buttonType: 2, onClickAction: () => toggling(), label: playing ? "Pause" : "Play" } },
と変更
しかし
onClickAction: () => toggling(),
のtoggling()
の部分でエラー
型 'boolean | ((e: any) => void)' のすべての構成要素が呼び出し可能なわけではありません。 型 'false' には呼び出しシグネチャがありません。
が出た
ここで、返り値として関数を返していないのが原因かと思い
return [playing, toggling];
を
return [playing, toggling()];
と変更するが、toggling()
に引数が一つ必要だとエラーがでたので
useCallback
のe
を削除してみて実行したことろ、描画の際にplaying
の値がtrue
とfalse
を繰り返してエラーになってしまうようになった。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/29 02:40
2020/06/29 02:49