๐React - ืืืจืื
ืืืืื ืฉืื ืืืจ ืฉืื ืขื ื ืืืื ืฆื ืืคืจืงืื ื ืคืจืืื.

useRef
ืื ืื useRef?
useRef ืืืืืจ ืืืืืืงื ืขื ืฉืื current ืฉื ืืชื ืืฉื ืืชื ืืืื ืืืจืื ืืจืื ืืืจ. ืืฉืืฉ ื:
- ืืืฉื ืืืืื ืืื ื-DOM (ืืืฉื ืคืืงืืก ืืงืื).
- ืฉืืืจื ืขื ืขืจืืื ืืชืืฉืืื ืืื ืจืื ืืืจืื (ืืืืืจืื, ืืื ืื, previous value).
- ืืืืื ืขื ืืจืืฆื ืืจืืฉืื ื ืฉื ืืคืงืืื/ืืืื ื ืืื mount ื-update.
ืชืืื ืขื ืืื ืื
1) ref ื-DOM
ืืืืื: ืคืืงืืก ืืืืืืื ืขื ืฉืื ืงืื ืืขืช mount.
const inputRef = useRef(null);
useEffect(() => {
inputRef.current?.focus();
}, []);
return <input ref={inputRef} />;ืืืืื ืืื
2) ืขืจืืื ืืชืืฉืืื ืืื ืจืื ืืืจ
ืฉืื ืื ref.current ืื ืืคืขืื ืจืื ืืืจ, ืืื ืืชืืื ืืืืืืจืื, ืืื ืื ืคื ืืืืื ืื ืฉืืืจื ืขื ืืืืืืงืืื ืืื ืจืื ืืืจืื.
const ref = useRef(0);
ref.current += 1; // ืื ืืืจืื ืืจืื ืืืจืืืืื ืืื
ืขืจื ืืชืื useRef ืืื ื ืืคืขืื ืจืื ืืืจ; ืืื ืืฉืืืจืช ืกืคืืจืืช, ืืืืื ืืืืืืจืื.
3) Previous Value ืขื useRef
ืฉืืืจืื ืืช ืืขืจื ืืงืืื ืืื ืฉืื ืื, ืืื ืจืื ืืืจ ื ืืกืฃ.
const [value, setValue] = useState(0);
const prevRef = useRef(value);
useEffect(() => { prevRef.current = value; }, [value]);ืืืืื ืืื
4) ืืืืืช ืืืื ื DOM
ืืชืืื ืืืืืืืช, ืืืงืืืื ืึพlayout.
const boxRef = useRef(null);
const [rect, setRect] = useState({});
useEffect(() => {
const el = boxRef.current;
if (!el) return;
const update = () => setRect(el.getBoundingClientRect());
update();
const ro = new ResizeObserver(update);
ro.observe(el);
return () => ro.disconnect();
}, []);ืืืืื ืืื
5) ื ืืืื ืืื ืืจืืืืื ืขื ref
ืฉืืืจืื ืืช ืืืื ืืืื ืืจืืื ืึพref ืืื ืืขืฆืืจ/ืืืคืขืื ืืืืืื ืข ืืืืืงื ืึพstate.
const idRef = useRef(null);
const start = () => {
if (idRef.current) return;
idRef.current = setInterval(doSomething, 1000);
};
const stop = () => {
clearInterval(idRef.current);
idRef.current = null;
};ืืืืื ืืื
6) UseRefBasics โ ืืงืื ืฉืื (ืขื ืืขืจืืช)
import { useEffect, useRef, useState } from 'react';
const UseRefBasics = () => {
const [value, setValue] = useState(0);
const refContainer = useRef(null);
const isMounted = useRef(false);
const handleSubmit = (e) => {
e.preventDefault();
console.log(refContainer.current); // ืืฆืืืข ืืงืื
const name = refContainer.current.value; // ืงืจืืืช ืขืจื ืื- input
console.log(name);
};
useEffect(() => {
// ืืคืืงืืก ืขื ืืงืื ืืขืช mount
refContainer.current.focus();
}, []);
useEffect(() => {
// ืืืืื ืขื ืืจืืฆื ืืจืืฉืื ื
if (!isMounted.current) {
isMounted.current = true;
return;
}
console.log('re-render'); // ืืจืืฅ ืจืง ืืขืืืื ืื
}, [value]);
return (
<div>
<form className='form' onSubmit={handleSubmit}>
<div className='form-row'>
<label htmlFor='name' className='form-label'>Name</label>
<input type='text' id='name' ref={refContainer} className='form-input' />
</div>
<button type='submit' className='btn btn-block'>submit</button>
</form>
<h1>value : {value}</h1>
<button onClick={() => setValue(value + 1)} className='btn'>increase</button>
</div>
);
};
export default UseRefBasics;7) ืืืคืื ืืืืฉืื
- ืฉืื ืื
ref.currentืื ืืจื ืืจ โ ืืื ืืฉืืืจืช ืืืืข ืฆืืื (ืืืืืจืื, previous value, ืืืืื). - ืื ืชืืชืื ืึพ
ref.currentืืชืื ืืจืื ืืืจ ืื ืืขืจื ืืฉืคืืข ืขื ืึพUI; ืืฉืืื ืื ืืฉstate. - ืืฉืืืื ืขื
useEffect: ื ืืชื ืืฉืืืจ ืืืืื ืืืisMounted.currentืืื ืืืื ืขื ืืจืืฆื ืืจืืฉืื ื. - ืืืืืืืช DOM ืืขืืืคื
ResizeObserverืขื ืืืืื ืresizeืืืืืืืื.
8) SEO: ืงืืฉืืจืื ืืืฆืื ืืื (Best Practices)
- ืืฉืชืืฉื ืืขืืื ืขื ืืงืกื ืชืืืืจื (Anchor Text) ืฉืืกืืืจ ืื ืืฉ ืืงืืฉืืจ โ ืื ืขืืืจ ืืื ืืขื ืืืคืืฉ ืืืื ืืฉื.
- ืืืขื ืืืฆืื ื ืคืชืื ืืืื ืืืฉ ืืืืฆืขืืช
target="_blank"+ ืืืกืืคืrel="noopener noreferrer"ืืืืืืืช. - ืื ืืงืืฉืืจ ืืืืชื/ืจืฉืื, ืืืืืจื ืืช ืฉื ืืืงืืจ (MDN/React Docs) ืืืงืกื.
// ืืืืืช ืงืืฉืืจืื ืืืฆืื ืืื ืืืืืืชืืื ื-SEO:
<p>
ืงืจืื ืืช
{' '}
<a
href="https://react.dev/reference/react/useRef"
target="_blank"
rel="noopener noreferrer"
>
ืืชืืขืื ืืจืฉืื ืฉื React ืขื useRef
</a>
{' '}ืืื ืืช
{' '}
<a
href="https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver"
target="_blank"
rel="noopener noreferrer"
>
ืืืจืื MDN ืขื ResizeObserver
</a>
.
</p>ืงืืฉืืจืื ืืืขืืืื:
๐ ืกืืืื
useRef ืืื ืืื ืืืืฉ ืืฉืืืจืช ืืฆืืืขื DOM ืืขืจืืื ืืชืืฉืืื ืืื ืจืื ืืืจ. ืืฉืชืืฉ ืื ืืืืืืืช, ืคืืงืืก, ืืืืืจืื ืืืฉืืืื ืืืืืืจ-ืืืื ืืื ืขื useEffect.