Single reference
A simple <input/>
element looks like:
JSX
import { useEffect, useRef, useState } from react;
const SimpleInput = () => {
const inputRef = useRef(null);
useEffect( () => {
inputRef.current.focus();
}, []);
return(
<div className = 'Input'>
<input ref = {inputRef} placeholder = 'Name'></input></div>);
}
export default SimpleInput;
The <input/>
will focus after DOM is loaded. If you execute console.log(inputRef)
:
JSX
{current: input}
inputRef
is an object with a single current
property.
Multiple references
But what would happen with an undetermined array of <input/>
?
We need to define inputRef
as an array, so that current
property becomes an array as well.
JSX
import { useEffect, useRef, useState } from react;
const ArrayInputs = () => {
// The number of references is undetermined
// After fetching data, we can determine array's length
const inputRef = useRef([]);
// Data is empty before fetching
const [data, setData] = useState([]);
useEffect( () => {
// We will fetch data and receive an array
// let data = fetchData();
// To simplify, let's suppose that the array is:
let data = ['Name', 'Age', 'Gender'];
// We define the size of array after receiving the data
inputRef.current = new Array(data.length);
// We set state
setData(data);
}, []);
useEffect( () => {
// If data is filled -> focus
if(data.length !== 0) {
// Focusing the last <input></input>
inputRef.current[data.length - 1].focus();
}
}, [data]);
return(
<div className = 'Inputs'>
{data.map((element, i) => <input ref = {el => inputRef.current[i] = el} placeholder = {element}></input>)}
</div>
);
}
export default ArrayInputs;
The last <input/>
will focus after DOM is loaded.
If you execute console.log(inputRef)
:
JSX
{current: [input, input, input]}
Now, inputRef
is an object with an array as current
property. We can access to a single reference by writing inputRef.current[i]
.
Top comments (0)