useRef
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 οΏ½?ιγγεη
§γγ¦γγ γγγ
δΎ 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 γ§ 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 γζδ½γγγεη §γγ¦γγ γγγ
δΎ 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 οΏ½?ε€γθͺγΏεγ£γγζΈγθΎΌγγ γγγγγ¨γ―許γγγ¦γγΎγγγγγγγδ»εοΏ½?ε ΄εγ―ει‘γγγΎγγγγͺγγͺγγεΌγ³εΊγη΅ζγ―εΈΈγ«εγγ§γγγζ‘δ»Άεε²γ«γγζΈγθΎΌγΏγ―εζεζγ«οΏ½?γΏοΏ½?οΏ½θ‘γγγγγγγ³γ³γγΌγγ³γοΏ½?ζ―γθγγοΏ½?οΏ½ε
¨γ«δΊζΈ¬ε―θ½γ¨γͺγγγγ§γγ
γγγ«ζ·±γη₯γ
εγγ§γγ«γδ½Ώη¨γγ¦γγ 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} />;γ³γ³γ½γΌγ«γ«γοΏ½?γγγͺγ¨γ©γΌγ葨瀺γγγγγγγγΎγγγ
γγγ©γ«γγ§γ―γη¬θͺγ³γ³γγΌγγ³γγ―γε ι¨οΏ½? 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 γγΌγγ«γ’γ―γ»γΉγγγεη §γγ¦γγ γγγ