Skip to content
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

[Compiler Bug]: InvalidReact: Ref values (the current property) may not be accessed during render. False Positive #32320

Open
1 of 4 tasks
funktr0n opened this issue Feb 6, 2025 · 5 comments
Labels
Component: Optimizing Compiler Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug Type: Bug

Comments

@funktr0n
Copy link

funktr0n commented Feb 6, 2025

What kind of issue is this?

  • React Compiler core (the JS output is incorrect, or your app works incorrectly after optimization)
  • babel-plugin-react-compiler (build issue installing or using the Babel plugin)
  • eslint-plugin-react-compiler (build issue installing or using the eslint plugin)
  • react-compiler-healthcheck (build issue installing or using the healthcheck script)

Link to repro

https://playground.react.dev/#N4Igzg9grgTgxgUxALhAHQHYIB4AcIwAuABACYIBmAhlADYkVQZyECWEGxAsgJ4CCuXAAoAlMWCZixOBzAlSrAG4AlSsQC8xKGASqKQjHVoiA3JOmySAWx4AJKhlK0EMDcQQaAfOPNSqzoiEFFUoAOjhYGAQMQlDWDCwYABUcQlNzAF9zGQw5Ygc4AAsCAAUYCFwwN2AMs0585mKYMoqwUI4AYVpWOABrN1EvYht7RwDROsxzKMJYTiFfYgAeT0WpJeDiKIp1YGC9DM9bBFpaCGIAdQJaUiWAemDV+ql1qnFQj4KmlsrDi8KqPIIAgqoRCh5NmAqDwAPz3KhPF7LO6I4jpDBZDAgDJAA

Repro steps

  1. Create a ref with useRef()
  2. Create an event handler that accesses ref.current
  3. Create an arbitrary object
  4. Assign an arbitrary property to that object and set it equal to a function that calls the handler from step 2.
  5. Witness the InvalidReact: Ref values (the current property) may not be accessed during render. error

Ex (also in playground link):

export default function MyApp() {
  const divRef = useRef(null);
  const myHandler = e => {
    alert(divRef.current.innerText);
  }
  const anchorProps = {};
  anchorProps.onClick = () => myHandler();


  return (
    <>
      <div ref={divRef}>Hello World</div>
      <a {...anchorProps}>What does the div say?</a>
    </>
  );
}

How often does this bug happen?

Every time

What version of React are you using?

18.3.1

What version of React Compiler are you using?

19.0.0-beta-27714ef-20250124

@funktr0n funktr0n added Component: Optimizing Compiler Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug Type: Bug labels Feb 6, 2025
@sushanthi1813
Copy link

You can keep an eye on the React Compiler release notes for updates regarding this issue.

@funktr0n
Copy link
Author

You can keep an eye on the React Compiler release notes for updates regarding this issue.

@sushanthi1813 I'm not seeing any release notes at that link

@mofeiZ
Copy link
Contributor

mofeiZ commented Feb 19, 2025

Thanks for the report! We've been working on reducing false positives from ref.current validation but this one seems to have slipped by.

@dinge321
Copy link

dinge321 commented Feb 19, 2025

For what ive seen in the documentation the problem is because it doesnt consider the possibility that you can add an onClick property later in the code, which make react think its another property that cannot use the current method of a ref, ill lok at it, post the answer if i find the problem causing it to false positive that

@dinge321
Copy link

okay, i think i found it, well in the declaration of the function validateNoRefAccessInRenderImpl on react/compliler/packages/babel-plugin-react-compiler/src/Validation/ValidateNoRefAccesInRender.ts we have cases and each case is treated differently, for example, the ObjectMethod dont call any problems, but the problem is, when you call anchorProps.onClick = () => myHandler(); is not calling the ObjectMethod case, but is calling the PropertyStore case, which triggers by basically anything that stores a new property, the problem is this case also includes ComputedStore which is something like this myObject["age"] = 30; which could be interpreted as we are calling the current property in render lets say for example myObject["age"] = divRef and that could get that error, but as im new to this community i call @mofeiZ to take a look at this and tell me if im right

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Component: Optimizing Compiler Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug Type: Bug
Projects
None yet
Development

No branches or pull requests

4 participants