teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

試したことの記述

2020/06/29 02:49

投稿

ryota-code
ryota-code

スコア0

title CHANGED
File without changes
body CHANGED
@@ -45,4 +45,75 @@
45
45
  label: playing ? "Pause" : "Play"
46
46
  }
47
47
  }
48
- ```
48
+ ```
49
+
50
+ ###試したこと
51
+
52
+ ```
53
+ const url = "http://www.ne.jp/asahi/music/myuu/wave/hana.mp3";
54
+ const useAudio = (url: string) => {
55
+ const [audio] = useState(new Audio(url));
56
+ const [playing, setPlaying] = useState(false);
57
+ const toggling = useCallback(
58
+ e => {
59
+ setPlaying(!playing);
60
+ console.log(playing);
61
+ },
62
+ [playing]
63
+ );
64
+
65
+ useEffect(() => {
66
+ playing ? audio.play() : audio.pause();
67
+ }, [playing]);
68
+
69
+ useEffect(() => {
70
+ audio.addEventListener("ended", () => setPlaying(false));
71
+ return () => {
72
+ audio.removeEventListener("ended", () => setPlaying(false));
73
+ };
74
+ }, []);
75
+
76
+ return [playing, toggling];
77
+ };
78
+ const [playing, toggling] = useAudio(url);
79
+ ```
80
+
81
+ ```
82
+ audioPlayerProps: {
83
+ buttonPlayProps: {
84
+ buttonType: 2,
85
+ onClickAction: () => toggling(),
86
+ label: playing ? "Pause" : "Play"
87
+ }
88
+ },
89
+ ```
90
+
91
+ と変更
92
+
93
+ しかし
94
+ ```
95
+ onClickAction: () => toggling(),
96
+ ```
97
+ の```toggling()```の部分でエラー
98
+
99
+
100
+ ```この式は呼び出し可能ではありません。
101
+ 型 'boolean | ((e: any) => void)' のすべての構成要素が呼び出し可能なわけではありません。
102
+ 型 'false' には呼び出しシグネチャがありません。
103
+ ```
104
+
105
+ が出た
106
+
107
+ ---
108
+ ここで、返り値として関数を返していないのが原因かと思い
109
+ ```
110
+ return [playing, toggling];
111
+ ```
112
+
113
+ ```
114
+ return [playing, toggling()];
115
+ ```
116
+
117
+ と変更するが、```toggling()```に引数が一つ必要だとエラーがでたので
118
+
119
+ ```useCallback```の```e```を削除してみて実行したことろ、描画の際に```playing```の値が``true``と`false`を繰り返してエラーになってしまうようになった。