Comments (4)
Thanks for filing this. If i'm understanding correctly, the issue is with the following two lines:
const form = useForm({ defaultValues: { customerId: "", addressId: "" } });
const customerId = form.watch("customerId");
Where the customerId
isn't updating when React Compiler is applied.
React Compiler is applying the equivalent of the following to this code:
const form = useForm({ defaultValues: { customerId: "", addressId: "" } });
const customerId = useMemo(() => form.watch("customerId"), [form]);
If you do the same, and apply useMemo (without the compiler), does customerId
update as you'd expect? Note that React components must be pure/idempotent. If props, state, and context haven't changed, then the component is expected to return the same result. Since form
is the same, it's expected that customerId
would be the same too. So it would help to understand if customerId updates if you use the useMemo version without compiler applied.
from react.
Got it - thanks! Will close out then since this works as expected when using useWatch
.
from react.
@josephsavona Thanks for the quick response.
If you do the same, and apply useMemo (without the compiler), does customerId update as you'd expect?
const form = useForm({ defaultValues: { customerId: "", addressId: "" } });
const customerId = useMemo(() => form.watch("customerId"), [form]);
If I apply this change manually without the compiler enabled, I still get the same result (customerId
not being updated) because as you mentioned, form
remains the same across re-renders.
I can get around issue using the useWatch
hook react-hook-form
provides but it was unexpected that the behavior changed with the compiler enabled.
from react.
Thanks for confirming. As I noted above, React expects components to be idempotent and only update if their props, state, or context changes. It looks like the watch()
API isn't using state to tell React that something has changed, which goes against React's rules around idempotency.
The useWatch()
API looks like it does use internal state to tell React when changes occur, so that should work just fine (both with useMemo and React Compiler).
from react.
Related Issues (20)
- Bug: Updater function of set state in promise.then clause of useEffect are called twice and replacing state before promise.then doesn't work as expected. HOT 4
- [Compiler Bug]: Mutating a ref passed as argument from a hook warns HOT 2
- [React 19]
- Bug: Changes to marker references post-render are not updating in Safari
- [React 19] useSyncExternalStore shim might break HOT 8
- [React 19] `use` is significantly slower in some scenarios than throwing a Promise HOT 10
- Bug: useState is not getting updated inside Event Listener (Webrtc DataChannel). HOT 2
- [React 19] Controlled number input does not update defaultValue when value prop has changed HOT 4
- Bug: onPointerDown not called when rendered in 'display: contents' root HOT 4
- [Compiler Bug]: Compiler incorrectly removes memoization of an expensive operation in useMemo HOT 3
- [DevTools Bug]: Open in editor , Path not found error HOT 2
- Bug: Ref is set after componentDidMount (when mixing Class and Functional components) HOT 3
- [React 19] Disabling prerendering siblings of suspended components breaking common pattern HOT 16
- [Compiler Bug]: Constants or properties named `use*` trigger compiler errors re: hooks HOT 2
- [React 19] Using spread with binary conditional in JSX causes error in dev env for case of using legacy JSX transform HOT 3
- [DevTools Bug] Cannot add node "1" because a node with that id is already in the Store. HOT 1
- [React 19] When multiple components call `use` inside a `Suspense`, it crosses the boundary of `Suspense` and stops rendering of other `Suspense` as well HOT 2
- [Compiler]: Type inference information does not propagate past phi nodes HOT 1
- Bug: "Should not already be working" Error Provides No Information (Not Even the Name Indicates What's Wrong)
- [React 19] React-Dom bundle increase 200kb HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react.