質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

2398閲覧

ReactでRemoveEventListnerが効かない

te_ff

総合スコア13

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/07/14 09:41

編集2021/07/14 10:02

前提・実現したいこと

動画再生サイトを作成しております。
複数の動画を1つの画面で再生しており、メインで再生している動画が切り替わった際にメインで再生していた動画のEventを削除したいのですが、うまくいきません。
RemoveEventListnerを効かせるやり方を教えていただきたいです。

該当のソースコード

activeVideoIdにはランダムで生成したstring型のuuidが入っており、activeVideoIdでメインで再生している動画の判別をしています

const [intervalId, setIntervalId] = useState(0); useEffect(() => { if (context.activeVideoId === props.video.uuid) { console.log("add"); videoEle.addEventListener("play", playEvent); videoEle.addEventListener("ended", endedEvent); } else { console.log("remove"); videoEle.removeEventListener("play", playEvent); videoEle.removeEventListener("ended", endedEvent); } }, [context.activeVideoId]); const playEvent = () => { let id = setInterval(() => { context.setFrame(videoEle.currentTime * context.fps); return () => clearInterval(id); }, context.fps); setIntervalId(id); }; const endedEvent = () => { context.setIsPlay(false); pauseEvent(); }; const pauseEvent = () => { clearInterval(intervalId); };

試したこと

addEventListener、removeEventListnerの第三引数に false を設定

playEvent/endedEventを定数ではなく、functionで定義

捕捉

VideoEleにはdocument.createElement("video")で<video>要素を作成し、格納しています。

現象としてはメインではない動画が再生終了すると動画が止まってしまいます。
endedEventにconsole.logを追加し確認したところコンソールに表示されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/07/14 09:43

・videoEleはどのような変数ですか? ・具体的にどのようなことが起きて、「うまくいかない」と判断しているのですか?
te_ff

2021/07/14 09:59

捕捉追記しました。 よろしくお願いいたします
guest

回答2

0

自己解決

https://stackoverflow.com/questions/55360736/how-do-i-window-removeeventlistener-using-react-useeffect

useCallbackを利用し、useEffectのreturnでremoveEventListnerを返してあげることによりできました。

useEffect(() => { if (context.activeVideoId === props.video.uuid) { videoEle.addEventListener("ended", endedEvent); } else { videoEle.removeEventListener("ended", endedEvent); } return () => videoEle.removeEventListener("ended", endedEvent); }, [context.activeVideoId]); const endedEvent = useCallback(() => { context.setIsPlay(false); });

投稿2021/07/15 05:20

te_ff

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

VideoEleにはdocument.createElement("video")で<video>要素を作成し、格納しています。

特に理由がないのであれば、このような形にはしないほうがいいです。ReactのJSX内に<video>を書けば、イベントもReact経由で管理できます。

投稿2021/07/14 10:01

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問