-
Notifications
You must be signed in to change notification settings - Fork 47.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bug: Unexpected warning in react-hooks/exhaustive-deps using optional chaining operator #18985
Comments
what is bar ? |
This is not real code it's just a synthetic example to reproduce this particular bug. In this example |
By using the ?. operator instead of just ., JavaScript knows to implicitly check to be sure foo.bar is not null or undefined before attempting to access bar. If foo is null or undefined, the expression automatically short-circuits, returning undefined. just put your foo.bar in deps Array useEffect |
I'm hitting this too with latest exhaustive-deps |
From looking at this change, it looks like you need to change your code to export default () => {
const foo = getFoo();
useEffect(() => {
if (foo?.bar) {
doSomethingWith(foo);
}
}, [foo?.bar]);
return null;
}; And it should work. |
@tbergq If I make that change it will miss changes to The point that I'm trying to make is that the optional chaining operator ( |
Sorry, yes, you are right, I missed the
Yeah, that is probably right, I see if you write this without optional chaining it would look like export default () => {
const foo = getFoo();
React.useEffect(() => {
if (foo && foo.bar) {
doSomethingWith(foo);
}
}, [foo]);
return null;
}; and that does not produce an eslint error. |
Got the same problem here. |
This also happens in cases where we may access a prototype method on the dependency, such as React.useEffect(() => {
if (arr?.includes('value')) {
// ...
}
}, [arr]) |
…ng and optional chaining of dependencies, relates to facebook#18985
Happy to take a fix! |
… and optional chaining of dependencies, relates to facebook#18985
@yanneves Looks like that would work, do you mind adding a test case for this specific issue too? Something like: {
code: normalizeIndent`
function MyComponent(props) {
useEffect(() => {
console.log(props?.foo);
console.log(props);
}, [props]);
}
`
} |
|
@jcestibariz just added that to the test suite and it passes, not sure whether it's worth submitting a new PR for it, the underlying logic is identical to this test {
code: normalizeIndent`
function MyComponent(props) {
useEffect(() => {
console.log(props.foo);
console.log(props.foo?.bar);
}, [props.foo]);
}
`,
} |
@yanneves You're right it's basically the same check. Thank you for checking. If it ever happens again I'll know pretty soon after :) |
With 4.0.4, I'm still getting an error at const computedArray = useMemo(
() => veryLongArray?.map(costlyComputation),
[veryLongArray]
); Exact error:
|
me too |
Yeah, we are getting the same bug as well. Update: This was just fixed in #19062 😹 |
Optional chaining problems should be fixed in |
When the optional chaining operator (
?.
) is used inside a hook and the variable is already listed in the dependencieseslint-plugin-react-hooks
reports an unexpected "missing dependency" warning. Replacing?.
with.
produces the expected behaviour: the warning is no longer reported.I would expect that the optional chaining operator (
?.
) be handled as normal property access (.
) in the context of this validation.React version: 16.13.1
eslint-plugin-react-hooks version: 4.0.2
Steps To Reproduce
Notice that
foo
is both referenced inside the code inuseEffect
and is listed as a dependency.package.json
The current behavior
The following warning is reported:
The expected behavior
No warning should be reported.
Additional notes
With the following code, which only replaces
?.
with.
,eslint-plugin-react-hooks
behaves as expected, that is no warning is reported. (Of course this fails at runtime whenfoo
is undefined).The text was updated successfully, but these errors were encountered: