I am trying to create multiple refs based on the length of input array.
export default function test(props) {
const numRefs = props.data.length;
let [refs, setRefs] = useState([]);
for (let i = 0; i < numrefs; i++) {
let ref = useRef(null);
setRefs(result => [...result, ref]);
}
return (
<div>
// Then I want to return numRefs number of divs each with a ref = one of ref from refs array
<div ref = {}></div>
</div>
)
}
React doesn't allow you to have hooks inside a loop and I am getting the error ->
' React Hook "useRef" may be executed more than once. Possibly because it is called in a loop. React Hooks must be called in the exact same order in every ponent render'
Is it possible to achieve this?
I am trying to create multiple refs based on the length of input array.
export default function test(props) {
const numRefs = props.data.length;
let [refs, setRefs] = useState([]);
for (let i = 0; i < numrefs; i++) {
let ref = useRef(null);
setRefs(result => [...result, ref]);
}
return (
<div>
// Then I want to return numRefs number of divs each with a ref = one of ref from refs array
<div ref = {}></div>
</div>
)
}
React doesn't allow you to have hooks inside a loop and I am getting the error ->
' React Hook "useRef" may be executed more than once. Possibly because it is called in a loop. React Hooks must be called in the exact same order in every ponent render'
Is it possible to achieve this?
Share Improve this question asked May 27, 2020 at 6:03 ps1234ps1234 1612 silver badges10 bronze badges1 Answer
Reset to default 8Make use of callback approach to assigning refs within a loop. You do not need multiple instances of useRef. You can create one ref and store all refs to div within it
export default function test(props) {
const numRefs = props.data.length;
let [refs, setRefs] = useState([]);
let divRef = useRef({});
return (
<div>
{Array.from(new Array(20)).map((_, i) => <div ref = {ref => divRefs.current[i] = ref}></div>)}
</div>
)
}