Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I use spread operator in useEffect without infinite loop?

Tags:

reactjs

I code a Chrome extension. popup.html is implemented in React as follows:

const [blogUrls, setblogUrls] = useState<string[]>([]);

useEffect(() => {
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    const newBlogUrls = [...blogUrls, ...request.param.blogUrls];
    setblogUrls(newBlogUrls);

    return true;
  });
}, [blogUrls]);

How do I avoid an infinite loop?

I know it's not good to write [blogUrls] even though I wrote setblogUrls(newBlogUrls).

But I want to write like [...blogUrls,.

Please tell me how to resolve this contradiction.

like image 698
kako-jun Avatar asked Aug 21 '26 09:08

kako-jun


1 Answers

Try this -

useEffect(() => {
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    const newBlogUrls = [...blogUrls, ...request.param.blogUrls];
    setblogUrls(newBlogUrls);

    return true;
  });

  return () => chrome.runtime.onMessage.removeEventListener();
}, []);

it will execute once after page render. your dependency blogUrls is changing after rendering page inside the useEffect itself. so useEffect calling itself again and again. So, its creating infinite loop. To render one time, just make sure it should be empty dependency in useEffect.

like image 133
Tamzid Ahmed Avatar answered Aug 24 '26 01:08

Tamzid Ahmed



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!