Reputation: 359
I want to use useEffect
, but when I add getUpperGroup
method, I get warning:
React Hook useEffect has a missing dependency: 'getUpperGroups'. Either include it or remove the dependency array"
My code is:
useEffect(() => {
getUpperGroups();
setContentData(contentGroupData);
}, [contentGroupData]);
const [contentData, setContentData] = useState<Fundation[]>([] as Fundation[]);
const [upperGroups, setUpperGroups] = useState({});
const getUpperGroups = () => {
let newUpperGroups = upperGroups;
contentGroupData.forEach(content=>{
newUpperGroups = {...newUpperGroups, [content.id]: content.title};
})
setUpperGroups(newUpperGroups);
}
Upvotes: 12
Views: 31001
Reputation: 276
This one worked for me.
Just add this comment at the last line of useEffect:
//eslint-disable-next-line
useEffect(() => {
getUpperGroups();
setContentData(contentGroupData);
//eslint-disable-next-line
}, [contentGroupData]);
Upvotes: 3
Reputation: 1473
You have two mistakes.
1- You defined getUpperGroups after useEffect, so you can't add it to the list of useEffect dependencies.
2- if you add getUpperGroups to list of useEffect dependencies, useEffect will run on every re-render and you give a loop of re-render error.
So there is two solutions.
1- Add getUpperGroups into useEffect
const [contentData, setContentData] = useState<Fundation[]>([] as Fundation[]);
const [upperGroups, setUpperGroups] = useState({});
useEffect(() => {
const getUpperGroups = () => {
let newUpperGroups = upperGroups;
contentGroupData.forEach(content=>{
newUpperGroups = {...newUpperGroups, [content.id]: content.title};
})
setUpperGroups(newUpperGroups);
}
getUpperGroups();
}, [contentGroupData]);
2- Disable eslint
useEffect(() => {
getUpperGroups();
setContentData(contentGroupData);
// eslint-disable-line react-hooks/exhaustive-deps
}, [contentGroupData]);
const [contentData, setContentData] = useState<Fundation[]>([] as Fundation[]);
const [upperGroups, setUpperGroups] = useState({});
const getUpperGroups = () => {
let newUpperGroups = upperGroups;
contentGroupData.forEach(content=>{
newUpperGroups = {...newUpperGroups, [content.id]: content.title};
})
setUpperGroups(newUpperGroups);
}
Upvotes: 10
Reputation: 235
You can either:
Suppress that rule for the entire project: Go to .eslintrc file and change 'react-hooks/exhaustive-deps': 'error'
to 'react-hooks/exhaustive-deps': 'warn'
or 'react-hooks/exhaustive-deps': 'off'
Supress the rule only in this instance:
useEffect(() => {
getUpperGroups();
setContentData(contentGroupData);
}, [contentGroupData]);
const [contentData, setContentData] = useState<Fundation[]>([] as Fundation[]);
const [upperGroups, setUpperGroups] = useState({});
const getUpperGroups = () => {
let newUpperGroups = upperGroups;
contentGroupData.forEach(content=>{
newUpperGroups = {...newUpperGroups, [content.id]: content.title};
})
setUpperGroups(newUpperGroups);
} // eslint-disable-line react-hooks/exhaustive-deps
Upvotes: 2
Reputation: 15166
Probably I would try to move the definition of getUpperGroups
into useEffect
. Also you can use .map()
and the previous state of your groups
state.
Try as the following:
useEffect(() => {
const getUpperGroups = () => {
setUpperGroups(prevUpperGroups => contentGroupData.map((content) => ({
...prevUpperGroups,
[content.id]: content.title
})))
}
getUpperGroups();
setContentData(contentGroupData);
}, [contentGroupData]);
Upvotes: 0