Javascript (React_基本的なこと04)
■useRef, useEffectの試し。
チュートリアル部分を読み進めて、useRef, useEffectという新しいフックが出てきたのでその試し。少し使ってみて、useRefはコンポーネント上に出てこない変数の管理、useEffectは画面が表示された後の処理といったイメージ。
ウェブサイトでは動画の再生、停止を行うサンプルがあったので、それを基に修正や実行をしつつ挙動を確認していった。
サンプル画面としては下のような感じ。BtnAで下の動画の再生、停止ができる。BtnB、BtnCはPlayを押した数を表示する。

コードが次。
import { useState, useRef, useEffect } from 'react';
export default function App() {
const [isPly, setIsPlaying] = useState(false);
const ref = useRef(null);
const refCnt = useRef(0);
const [state, setState] = useState(0);
useEffect(() => {
if (isPly) {
ref.current.play();
refCnt.current = refCnt.current + 1;;
} else {
ref.current.pause();
}
});
function refSample() {
setIsPlaying(!isPly);
/* if (isPly) {
ref.current.play()
refCnt.current = refCnt.current + 1;;
refCnt.current = refCnt.current + 1;;
} else {
ref.current.pause();
} */
}
function showCnt() {
setState(refCnt.current);
}
function showCnt2() {
}
return (
<>
<p>
<button onClick={refSample} >
BtnA+{isPly ? 'Pause' : 'Play'}
</button>
</p>
<p>
<button onClick={showCnt} >
BtnB+{state}
</button>
<button onClick={showCnt2} >
BtnC+{refCnt.current}
</button>
</p>
<p>
<video ref={ref} src="/sample_mov1.mp4" width='400' loop playsInline />;
</p>
</>
);
}
実質的には、ウェブサイトのコードと同じ。Playボタンを押すと動画が開始され同時にボタンの表記がPauseになる。isPlyの初期値はfalseなので、BtnAボタンを押すと、refSample関数が実行され、setIsPlayingでTrueが設定される。最後にuseEffectが実行され、ref.current.play()が実行されるよう。
useEffectの代わりにコメントアウトした個所だけでも動画の再生、停止はできたが、setIsPlayingはすぐには実行されなかった。その後の分岐ではFalseのままと認定されるようで、初めのクリックではref.current.pause()が実行された。
useRef, useEffectは外部システムとの連携に使用できるとのことで、例えば、jQueryは表示されたDOM要素に対して処理を行うので、表示が完了した後のuseEffect内で使用するといった使い方ができそう。
チュートリアルはこのくらいにして、Reactと他のライブラリを組み合わせて何か作ってみたい。

