Search code examples
reactjsreact-hooksuse-effect

useEffect with function factory gets "React Hook useEffect received a function whose dependencies are unknown. Pass an inline function instead"


I have some side effect logic in multiple components wrapped in useEffect, where the logic is exactly the same except taking in different parameters, so I decided to take the logic out and move it into a function factory to supply to useEffect so not to repeat the logic everywhere. But once that is done, React is complaining "React Hook useEffect received a function whose dependencies are unknown. Pass an inline function instead". How do you get rid of it the proper way if not suppressing the warning?

e.g.

function ComponentA(props) {
    useEffect(() => {
        doThis(props.member);
        doThat(props.member);
    }, [props.member]);
}

function ComponentB(props) {
    useEffect(() => {
        doThis(props.member);
        doThat(props.member);
    }, [props.member]);
}

changed to

function ComponentA(props) {
    useEffect(logic(props.member), [props.member]);
}

function ComponentB(props) {
    useEffect(logic(props.member), [props.member]);
}

function logic(member) {
    return () => {
        doThis(member);
        doThat(member);
    };
}

Solution

  • Change useEffect to

    useEffect(() => { 
        logic(props.member);
    }, [props.member]);
    

    and change logic to

    function logic(member) {
      doThis(member);
      doThat(member);
    }