6

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 component render'

Is it possible to achieve this?

1 Answer 1

8

Make 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>
    )
} 
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.