React
useRef
useRef
is also a way to keep the values of variables unchanged when the component renders. But unlike useMemo or useCallback, useRef
doesn't have dependencies array and the value will persist for the full lifetime of the component. You can think useRef
is like a "box" that can hold a mutable value in it.
useRef
returns a mutable ref object whose .current
property is initialized to the passed argument (initialValue
)
// Call signature
const ref = useRef(initialValue)
// access ref.current for current value
Common Usage
Although useRef
can be used in different cases but the most common use case is to access a child imperatively
function TextInputWithFocusButton() {const inputEl = useRef(null);const onButtonClick = () => {// `current` points to the mounted text input elementinputEl.current.focus();};return (<><Button onClick={onButtonClick}>Focus the input</Button><input ref={inputEl} type="text" /></>);}
Uncommon usage
function TextInputWithFocusButton() {const typingTimeout = useRef(null);const [searchString, setSearchString] = useState("Search string appears here")// simple debounceconst handleInputChange = (e) => {clearTimeout(typingTimeout.current)typingTimeout.current = setTimeout(() => {setSearchString(e.target.value)}, 800)};return (<><inputtype="text"onChange={handleInputChange}placeholder="Search"/><p>{searchString}</p></>);}
Note
Keep in mind that useRef
doesn't notify you when its content changes. Mutating the .current
property also doesn't cause a re-render.