useRef は、レンダー時には不要γͺε€€γ‚’ε‚η…§γ™γ‚‹γŸγ‚οΏ½? React フックです。

const ref = useRef(initialValue)

γƒͺフゑレンス

useRef(initialValue)

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γƒˆγƒƒγƒ—γƒ¬γƒ™γƒ«γ§ useRef を呼び出して、ref γ‚’οΏ½?�言します。

import { useRef } from 'react';

function MyComponent() {
const intervalRef = useRef(0);
const inputRef = useRef(null);
// ...

さらに例を見る

εΌ•ζ•°

  • initialValue: ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΏ½? current プロパティ�?εˆζœŸε€€γ¨γ—γ¦θ¨­οΏ½?�する倀です。任意�?εž‹οΏ½?ε€€γ‚’ζŒ‡οΏ½?�できます。こ�?引数は 2 ε›žοΏ½?δ»₯降�?γƒ¬γƒ³γƒ€γƒΌγ§γ―η„‘θ¦–γ•γ‚ŒγΎγ™γ€‚

θΏ”γ‚Šε€€

useRef は、δ»₯δΈ‹οΏ½? 1 ぀�?γƒ—γƒ­γƒ‘γƒ†γ‚£γ γ‘γ‚’ζŒγ€γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚

  • current: ζΈ‘γ—γŸ initialValue γŒεˆζœŸε€€γ«θ¨­οΏ½?οΏ½γ•γ‚ŒγΎγ™γ€‚γ‚γ¨γ‹γ‚‰εˆ₯οΏ½?ε€€γ«ε€‰ζ›΄γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’ JSX γƒŽγƒΌγƒ‰οΏ½? ref ε±žζ€§γ¨γ—γ¦ React に渑すと、React は current プロパティ�?ε€€γ‚’θ¨­οΏ½?�します。

2 ε›žοΏ½?δ»₯降�?レンダーでは、useRef は同じγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚

注意点

  • ref.current γƒ—γƒ­γƒ‘γƒ†γ‚£γ―ζ›Έγζ›γˆγŒε―θƒ½γ§γ™γ€‚γ€γΎγ‚Š state γ¨ι•γ„γƒŸγƒ₯ータブル (mutable) γ§γ™γ€‚γŸγ γ—γ€γƒ¬γƒ³γƒ€γƒΌγ«εˆ©η”¨γ•γ‚Œγ‚‹γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΌˆstate οΏ½?一部γͺγ©οΌ‰γ‚’δΏζŒγ—γ¦γ„γ‚‹ε ΄εˆγ―γ€ε€‰ζ›΄γ™γΉγγ§γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚
  • ref.current プロパティを倉更しても、React γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ—γΎγ›γ‚“γ€‚ref はただ�? JavaScript γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ§γ™οΏ½?γ§γ€ε€‰ζ›΄γ•γ‚ŒγŸγ¨γ—γ¦γ‚‚γ€γγ‚Œγ‚’ React がηŸ₯ることはできγͺい�?です。
  • εˆζœŸεŒ–ζ™‚γ‚’ι™€γ„γ¦γ€γƒ¬γƒ³γƒ€γƒΌδΈ­γ« ref.current οΏ½?ε€€γ‚’θͺ­γΏε–γ£γŸγ‚Šζ›ΈγθΎΌγ‚“γ γ‚Šγ—γͺγ„γ§γγ γ•γ„γ€‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ζŒ―γ‚‹θˆžγ„γŒδΊˆζΈ¬δΈθƒ½γ«γͺγ‚ŠγΎγ™γ€‚
  • Strict Mode では、純粋でγͺγ„ι–’ζ•°γ‚’θ¦‹γ€γ‘γ‚„γ™γγ™γ‚‹γŸγ‚γ«γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆι–’ζ•°γŒ 2 ε›žε‘Όγ³ε‡Ίγ•γ‚ŒγΎγ™γ€‚γ“γ‚Œγ―ι–‹η™Ίζ™‚οΏ½?み�?ζŒ―γ‚‹θˆžγ„γ§γ‚γ‚Šγ€ζœ¬η•ͺγ«γ―ε½±ιŸΏγ—γΎγ›γ‚“γ€‚ε„ ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ― 2 ε›žη”Ÿζˆγ•γ‚ŒγΎγ™γŒγ€γοΏ½?うけ�? 1 γ€γ―η ΄ζ£„γ•γ‚ŒγΎγ™γ€‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆι–’ζ•°γŒη΄”η²‹γ§γ‚γ‚Œγ°οΌˆγγ†γ§γ‚γ‚‹γΉγγ§γ™οΌ‰γ€γ“οΏ½?ζŒ―γ‚‹θˆžγ„γ―γƒ­γ‚Έγƒƒγ‚―γ«ε½±ιŸΏγ—γΎγ›γ‚“γ€‚

使用法

ref を使用して倀を参照する

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γƒˆγƒƒγƒ—γƒ¬γƒ™γƒ«γ§ useRef を呼び出し、1 ぀δ»₯上�? ref γ‚’οΏ½?�言します。

import { useRef } from 'react';

function Stopwatch() {
const intervalRef = useRef(0);
// ...

useRef は、唯一�?プロパティであるcurrentγ«γ€ζŒ‡οΏ½?οΏ½γ•γ‚ŒγŸεˆζœŸε€€γŒθ¨­οΏ½?οΏ½γ•γ‚ŒγŸηŠΆζ…‹οΏ½? ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚

ζ¬‘ε›žδ»₯降�?レンダーでも、useRef は同じγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚γ“οΏ½?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΏ½? current γƒ—γƒ­γƒ‘γƒ†γ‚£γ‚’ζ›Έγζ›γˆγ‚‹γ“γ¨γ§ζƒ…ε ±γ‚’δΏε­˜γ—γ¦γŠγγ€γ‚γ¨γ‹γ‚‰γοΏ½?ε€€γ‚’θͺ­γΏε‡Ίγ™γ“γ¨γŒγ§γγΎγ™γ€‚γ“γ‚Œγ― state γ¨δΌΌγ¦γ„γΎγ™γŒγ€ε€§γγι•γ†η‚ΉγŒγ‚γ‚ŠγΎγ™γ€‚

γγ‚Œγ―γ€ref γ‚’ε€‰ζ›΄γ—γ¦γ‚‚γ€ε†γƒ¬γƒ³γƒ€γƒΌγ―γƒˆγƒͺγ‚¬γ•γ‚Œγͺいということです。こ�?ことから、ref γ―γ€ε‡ΊεŠ›γ•γ‚Œγ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ε€–θ¦‹γ«ε½±ιŸΏγ—γͺγ„γƒ‡γƒΌγ‚Ώγ‚’δΏε­˜γ™γ‚‹οΏ½?γ«ι©γ—γ¦γ„γΎγ™γ€‚δΎ‹γˆγ°γ€γ‚€γƒ³γ‚ΏγƒΌγƒγƒ«οΏ½? ID γ‚’δΏζŒγ—γ¦γŠγγ€γ‚γ¨γ‹γ‚‰εˆ©η”¨γ—γŸγ„ε ΄εˆγ€ref γ«δΏε­˜γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ref ε†…οΏ½?倀を更新するには、current プロパティを手動で倉更します。

function handleStartClick() {
const intervalId = setInterval(() => {
// ...
}, 1000);
intervalRef.current = intervalId;
}

そして、あとから、ref γ«δΏε­˜γ•γ‚Œγ¦γ„γ‚‹γ‚€γƒ³γ‚ΏγƒΌγƒγƒ« ID γ‚’θͺ­γΏε‡Ίγ™γ“γ¨γŒγ§γγΎγ™γ€‚γ“γ‚Œγ§γ‚€γƒ³γ‚ΏγƒΌγƒγƒ«γ‚’γ‚―γƒͺγ‚’γ™γ‚‹ι–’ζ•°γ‚’ε‘Όγ³ε‡Ίγ—γ€γ‚€γƒ³γ‚ΏγƒΌγƒγƒ«γ‚’ε‰Šι™€γ§γγΎγ™γ€‚

function handleStopClick() {
const intervalId = intervalRef.current;
clearInterval(intervalId);
}

ref を使用することで、欑�?γ“γ¨γŒδΏθ¨Όγ•γ‚ŒγΎγ™γ€‚

  • γƒ¬γƒ³γƒ€γƒΌγ‚’θ·¨γ„γ§ζƒ…ε ±γ‚’δΏε­˜γ§γγΎγ™οΌˆι€šεΈΈοΏ½?倉数は、レンダーごとにγƒͺγ‚»γƒƒγƒˆγ•γ‚ŒγΎγ™οΌ‰γ€‚
  • ε€‰ζ›΄γ—γ¦γ‚‚ε†γƒ¬γƒ³γƒ€γƒΌγ―γƒˆγƒͺγ‚¬γ•γ‚ŒγΎγ›γ‚“οΌˆstate ε€‰ζ•°γ―γ€ε€‰ζ›΄γ™γ‚‹γ¨ε†γƒ¬γƒ³γƒ€γƒΌγŒγƒˆγƒͺγ‚¬γ•γ‚ŒγΎγ™οΌ‰γ€‚
  • δΏε­˜γ•γ‚ŒγŸζƒ…ε ±γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚€γƒ³γ‚Ήγ‚Ώγƒ³γ‚Ήγ”γ¨γ«ε›Ίζœ‰γ§γ™οΌˆγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?倖側で�?οΏ½ηΎ©γ•γ‚ŒγŸε€‰ζ•°γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚€γƒ³γ‚Ήγ‚Ώγƒ³γ‚Ήι–“γ§ε…±ζœ‰γ•γ‚ŒγΎγ™οΌ‰γ€‚

ref γ‚’ε€‰ζ›΄γ—γ¦γ‚‚ε†γƒ¬γƒ³γƒ€γƒΌγ―γƒˆγƒͺγ‚¬γ•γ‚Œγͺγ„γŸγ‚γ€ref γ―η”»ι’γ«θ‘¨η€Ίγ—γŸγ„ζƒ…ε ±γ‚’δΏε­˜γ™γ‚‹οΏ½?には適していません。そ�?γ‚ˆγ†γͺε ΄εˆγ―γ€δ»£γ‚γ‚Šγ« useState を使用してください。useRef と useState οΏ½?δ½Ώγ„εˆ†γ‘γ«ι–’γ—γ¦γ―γ€ref と state οΏ½?違いを参照してください。

useRef を用いて倀を参照する使用例

δΎ‹ 1/2:
γ‚―γƒͺックカウンタ

こ�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€γƒœγ‚Ώγƒ³γŒγ‚―γƒͺγƒƒγ‚―γ•γ‚ŒγŸε›žζ•°γ‚’δΏε­˜γ™γ‚‹γŸγ‚γ« ref を使用しています。こ�?例では、クγƒͺγƒƒγ‚―ε›žζ•°οΏ½?θͺ­γΏζ›Έγγ―γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©ε†…γ§οΏ½?γΏθ‘Œγ‚γ‚Œγ¦γ„γ‚‹γŸγ‚γ€state οΏ½?δ»£γ‚γ‚Šγ« ref を使用して構いません。

import { useRef } from 'react';

export default function Counter() {
  let ref = useRef(0);

  function handleClick() {
    ref.current = ref.current + 1;
    alert('You clicked ' + ref.current + ' times!');
  }

  return (
    <button onClick={handleClick}>
      Click me!
    </button>
  );
}

JSX 内で {ref.current} を葨瀺すると、クγƒͺγƒƒγ‚―γ—γ¦γ‚‚ε›žζ•°οΏ½?θ‘¨η€Ίγ―ζ›΄ζ–°γ•γ‚ŒγΎγ›γ‚“γ€‚γ“γ‚Œγ―γ€ref.current に新しい倀を設�?οΏ½γ—γ¦γ‚‚γ€ε†γƒ¬γƒ³γƒ€γƒΌγŒγƒˆγƒͺγ‚¬γ•γ‚Œγͺγ„γŸγ‚γ§γ™γ€‚γƒ¬γƒ³γƒ€γƒΌγ«εˆ©η”¨γ—γŸγ„ε€€γ―γ€δ»£γ‚γ‚Šγ« state γ«δΏε­˜γ—γ¦γγ γ•γ„γ€‚

落とし穴

レンダー中に ref.current οΏ½?ε€€γ‚’θͺ­γΏε–γ£γŸγ‚Šζ›ΈγθΎΌγ‚“γ γ‚Šγ—γͺいでください。

React γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆζœ¬δ½“οΏ½?ι–’ζ•°γŒη΄”ι–’ζ•°οΏ½?γ‚ˆγ†γ«ζŒ―γ‚‹θˆžγ†γ“γ¨γ‚’ζœŸεΎ…γ—γ¦γ„γΎγ™γ€‚

  • ε…₯εŠ›ε€€οΌˆprops、state、contextοΌ‰γŒεŒγ˜γͺγ‚‰γ€εΈΈγ«εŒγ˜ JSX を返さγͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚
  • ε‘Όγ³ε‡Ίγ—ι †γŒε€‰γ‚γ£γŸγ‚Šγ€εΌ•ζ•°γ‚’ε€‰γˆγ¦ε‘Όγ³ε‡Ίγ•γ‚ŒγŸγ‚Šγ—γ¦γ‚‚γ€δ»–οΏ½?ε‘Όγ³ε‡Ίγ—η΅ζžœγ«ε½±ιŸΏγ‚’δΈŽγˆγ¦γ―γ„γ‘γΎγ›γ‚“γ€‚

レンダー中に ref γ‚’θͺ­γΏζ›Έγγ™γ‚‹γ¨γ€γ“γ‚Œγ‚‰γ«ι•εγ—γ¦γ—γΎγ„γΎγ™γ€‚

function MyComponent() {
// ...
// 🚩 Don't write a ref during rendering
myRef.current = 123;
// ...
// 🚩 Don't read a ref during rendering
return <h1>{myOtherRef.current}</h1>;
}

δ»£γ‚γ‚Šγ«γ€γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©γ‚„γ‚¨γƒ•γ‚§γ‚―γƒˆγ‹γ‚‰ ref γ‚’θͺ­γΏζ›Έγγ—てください。

function MyComponent() {
// ...
useEffect(() => {
// βœ… You can read or write refs in effects
myRef.current = 123;
});
// ...
function handleClick() {
// βœ… You can read or write refs in event handlers
doSomething(myOtherRef.current);
}
// ...
}

もし、レンダー中に何かをθͺ­γΏε‡Ίγ—γŸγ‚Šζ›ΈγθΎΌγ‚“γ γ‚Šγ—γͺγ‘γ‚Œγ°γͺらγͺγ„ε ΄εˆγ―γ€δ»£γ‚γ‚Šγ« useState を使用してください。

γ“γ‚Œγ‚‰οΏ½?γƒ«γƒΌγƒ«γ‚’η ΄γ£γ¦γ„γ¦γ‚‚γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―ζ­£εΈΈγ«ε‹•δ½œγ—ηΆšγ‘γ‚‹γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚γ—γ‹γ—γ€θΏ‘γ„γ†γ‘γ« React γ«θΏ½εŠ γ•γ‚Œγ‚‹ζ–°ζ©Ÿθƒ½οΏ½?ε€šγγ―γ€γ“γ‚Œγ‚‰οΏ½?γƒ«γƒΌγƒ«γŒοΏ½?οΏ½γ‚‰γ‚Œγ‚‹γ“γ¨γ‚’ε‰ζγ¨γ—γ¦γ„γΎγ™γ€‚θ©³γ—γγ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’η΄”η²‹γ«δΏγ€γ‚’ε‚η…§γ—γ¦γγ γ•γ„γ€‚


ref で DOM γ‚’ζ“δ½œγ™γ‚‹

DOM γ‚’ζ“δ½œγ—γŸγ„ε ΄εˆγ€ref γ‚’εˆ©η”¨γ™γ‚‹γ“γ¨γŒιžεΈΈγ«ε€šγ„γ§γ™γ€‚React は、DOM へ�?γ‚’γ‚―γ‚»γ‚Ήγ‚’η΅„γΏθΎΌγΏγ§γ‚΅γƒγƒΌγƒˆγ—γ¦γ„γΎγ™γ€‚

ζœ€εˆγ«γ€εˆζœŸε€€γ‚’ null に設�?οΏ½γ—γŸ ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆ γ‚’οΏ½?�言します。

import { useRef } from 'react';

function MyComponent() {
const inputRef = useRef(null);
// ...

ζ¬‘γ«γ€ζ“δ½œγ—γŸγ„ DOM γƒŽγƒΌγƒ‰οΏ½? JSX οΏ½? ref ε±žζ€§γ«γ€ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’ζΈ‘γ—γΎγ™γ€‚

// ...
return <input ref={inputRef} />;

こ�? DOM γƒŽγƒΌγƒ‰γŒη”Ÿζˆγ•γ‚Œγ€η”»ι’γ«ι…οΏ½?γ•γ‚Œγ‚‹γ¨γ€ref γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΏ½? current プロパティにそ�? DOM γƒŽγƒΌγƒ‰γŒθ¨­οΏ½?οΏ½γ•γ‚ŒγΎγ™γ€‚γ“γ‚Œγ§γ€<input> οΏ½? DOM γƒŽγƒΌγƒ‰γ«γ‚’γ‚―γ‚»γ‚Ήγ—γ¦γ€focus() οΏ½?γ‚ˆγ†γͺγƒ‘γ‚½γƒƒγƒ‰γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γŒγ§γγ‚‹γ‚ˆγ†γ«γͺγ‚ŠγΎγ™γ€‚

function handleClick() {
inputRef.current.focus();
}

React γ―γ€γƒŽγƒΌγƒ‰γŒη”»ι’γ‹γ‚‰ε‰Šι™€γ•γ‚Œγ‚‹γ¨ current プロパティを null γ«ζˆ»γ—γΎγ™γ€‚

詳しくは、ref を使用して DOM γ‚’ζ“δ½œγ™γ‚‹γ‚’ε‚η…§γ—γ¦γγ γ•γ„γ€‚

useRef を使用して DOM γ‚’ζ“δ½œγ™γ‚‹δΎ‹

δΎ‹ 1/4:
input 要素をフォーカス

こ�?δΎ‹γ§γ―γ€γƒœγ‚Ώγƒ³γ‚’γ‚―γƒͺックすると input γ«γƒ•γ‚©γƒΌγ‚«γ‚ΉγŒε½“γŸγ‚ŠγΎγ™γ€‚

import { useRef } from 'react';

export default function Form() {
  const inputRef = useRef(null);

  function handleClick() {
    inputRef.current.focus();
  }

  return (
    <>
      <input ref={inputRef} />
      <button onClick={handleClick}>
        Focus the input
      </button>
    </>
  );
}


ref οΏ½?ε€€οΏ½?ε†η”Ÿζˆγ‚’ι˜²γ

React γ―γ€εˆε›žγ«ζΈ‘γ•γ‚ŒγŸ ref οΏ½?ε€€γ‚’δΏε­˜γ—γΎγ™γŒγ€γγ‚Œδ»₯降�?レンダーではそ�?倀は焑視します。

function Video() {
const playerRef = useRef(new VideoPlayer());
// ...

new VideoPlayer() οΏ½?η΅ζžœγ―εˆε›žγƒ¬γƒ³γƒ€γƒΌγ§οΏ½?γΏεˆ©η”¨γ•γ‚ŒγΎγ™γŒγ€γ™γΉγ¦οΏ½?レンダーで呼び出しθ‡ͺδ½“γ―η™Ίη”Ÿγ—γ¦γ„γΎγ™γ€‚γ“γ‚Œγ―γ€θ¨ˆοΏ½?οΏ½γ‚³γ‚ΉγƒˆοΏ½?ι«˜γ„γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’δ½œζˆγ—γ¦γ„γ‚‹ε ΄εˆγ«γ€η„‘ι§„γŒε€šγγͺγ‚ŠγΎγ™γ€‚

γ“γ‚Œγ‚’θ§£ζ±Ίγ™γ‚‹γŸγ‚γ«γ€ζ¬‘οΏ½?γ‚ˆγ†γ« ref γ‚’εˆζœŸεŒ–γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

function Video() {
const playerRef = useRef(null);
if (playerRef.current === null) {
playerRef.current = new VideoPlayer();
}
// ...

ι€šεΈΈγ€γƒ¬γƒ³γƒ€γƒΌδΈ­γ« ref.current οΏ½?ε€€γ‚’θͺ­γΏε–γ£γŸγ‚Šζ›ΈγθΎΌγ‚“γ γ‚Šγ™γ‚‹γ“γ¨γ―θ¨±γ•γ‚Œγ¦γ„γΎγ›γ‚“γ€‚γ—γ‹γ—γ€δ»Šε›žοΏ½?ε ΄εˆγ―ε•ι‘Œγ‚γ‚ŠγΎγ›γ‚“γ€‚γͺぜγͺγ‚‰γ€ε‘Όγ³ε‡Ίγ—η΅ζžœγ―εΈΈγ«εŒγ˜γ§γ‚γ‚Šγ€ζ‘δ»Άεˆ†ε²γ«γ‚ˆγ‚Šζ›ΈγθΎΌγΏγ―εˆζœŸεŒ–ζ™‚γ«οΏ½?み�?οΏ½θ‘Œγ•γ‚Œγ‚‹γŸγ‚γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ζŒ―γ‚‹θˆžγ„γŒοΏ½?οΏ½ε…¨γ«δΊˆζΈ¬ε―θƒ½γ¨γͺるからです。

さらに深くηŸ₯γ‚‹

useRef γ‚’ι…ε»Άγ—γ¦εˆζœŸεŒ–γ™γ‚‹ε ΄εˆγ« null γƒγ‚§γƒƒγ‚―γ‚’ε›žιΏγ™γ‚‹

εž‹γƒγ‚§γƒƒγ‚«γ‚’δ½Ώη”¨γ—γ¦γŠγ‚Š null γƒγ‚§γƒƒγ‚―γ‚’δ½•εΊ¦γ‚‚θ‘Œγ†οΏ½?γŒη…©γ‚γ—γ„ε ΄εˆγ―γ€ζ¬‘οΏ½?γ‚ˆγ†γͺパターンを試してみてください。

function Video() {
const playerRef = useRef(null);

function getPlayer() {
if (playerRef.current !== null) {
return playerRef.current;
}
const player = new VideoPlayer();
playerRef.current = player;
return player;
}

// ...

こ�?例では、playerRef θ‡ͺ体は null 許�?οΏ½γ§γ™γ€‚γ—γ‹γ—εž‹γƒγ‚§γƒƒγ‚«γ«γ€getPlayer() は null γ‚’θΏ”γ™ε ΄εˆγŒγͺγ„γ¨εˆ€ζ–­γ•γ›γ‚‰γ‚Œγ‚‹γ―γšγ§γ™γ€‚γγ“γ§γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©γͺどで getPlayer() を使用できます。


γƒˆγƒ©γƒ–γƒ«γ‚·γƒ₯ーティング

独θ‡ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγΈοΏ½? ref を取得できγͺい

δ»₯δΈ‹οΏ½?γ‚ˆγ†γ«γ—γ¦γ€η‹¬θ‡ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ« ref γ‚’ζΈ‘γγ†γ¨γ—γ¦γ„γ‚‹ε ΄εˆγ€

const inputRef = useRef(null);

return <MyInput ref={inputRef} />;

コンソールにこ�?γ‚ˆγ†γͺγ‚¨γƒ©γƒΌγŒθ‘¨η€Ίγ•γ‚Œγ‚‹γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚

Console
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

γƒ‡γƒ•γ‚©γƒ«γƒˆγ§γ―γ€η‹¬θ‡ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€ε†…ιƒ¨οΏ½? DOM γƒŽγƒΌγƒ‰γΈοΏ½? ref を公開していません。

γ“γ‚Œγ‚’οΏ½?ζ­£γ™γ‚‹γ«γ―γ€γΎγšγ€ref γ‚’ε–εΎ—γ—γŸγ„γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ζŽ’γ—γΎγ™γ€‚

export default function MyInput({ value, onChange }) {
return (
<input
value={value}
onChange={onChange}
/>
);
}

そして、欑�?γ‚ˆγ†γ« forwardRef でラップします。

import { forwardRef } from 'react';

const MyInput = forwardRef(({ value, onChange }, ref) => {
return (
<input
value={value}
onChange={onChange}
ref={ref}
/>
);
});

export default MyInput;

γ“γ‚Œγ§γ€θ¦ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰ ref γ‚’ε–εΎ—γ§γγ‚‹γ‚ˆγ†γ«γͺγ‚ŠγΎγ™γ€‚

詳しくは、εˆ₯οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? DOM γƒŽγƒΌγƒ‰γ«γ‚’γ‚―γ‚»γ‚Ήγ™γ‚‹γ‚’ε‚η…§γ—γ¦γγ γ•γ„γ€‚