react icon indicating copy to clipboard operation
react copied to clipboard

Bug: `react-hooks/rules-of-hooks` does not support `do/while` loops

Open tyxla opened this issue 1 year ago • 3 comments

React version: 18.2.0

Steps To Reproduce

  1. Use a hook inside a do/while loop.

  2. You'll see that it's not considered a violation of the rule.

Code example:

function ComponentWithHookInsideDoWhile() {
	do {
		useHookInsideLoop();
	} while (true);
}

The current behavior

The react-hooks/rules-of-hooks does not consider hook usage inside a do/while loop a violation.

The expected behavior

I expected that I'd see the following ESLint error:

React Hook useHookInsideLoop() 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.

tyxla avatar Apr 02 '24 13:04 tyxla

I've worked on fixing this in #28714

tyxla avatar Apr 02 '24 13:04 tyxla

Maybe instead of using do while loop you can do conditional rendering, create a state of condition and render the hook based on the condition.

In this method the hook won't be executed more than once!

pranshu05 avatar Apr 26 '24 09:04 pranshu05

@pranshu05 this issue isn't about how to write conditional or loop hooks in React. This is about the ESLint rule that catches whether someone is using a hook potentially in a loop. There's no guaranteed way through static code analysis to catch if a loop will iterate more than once or not. Also, the rules of hooks ESLint rule already warns if someone is using a hook in a while, which can also have one, or even zero iterations. So it only makes sense that we do the same for do/while which will have 1 or more iterations.

tyxla avatar Apr 27 '24 10:04 tyxla

My fix for this issue was autoclosed for no activity - could I ask for it to be reopened?

tyxla avatar Jul 23 '24 09:07 tyxla