-
Notifications
You must be signed in to change notification settings - Fork 4.2k
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
Editor: Fix the 'useSelect' warning in the 'useIsDirty' hook #53759
Conversation
Size Change: +29 B (0%) Total Size: 1.51 MB
ℹ️ View Unchanged
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tested and looked good to me 🙌
Thank you for taking care of this!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
for ( const property in siteEdits ) { | ||
siteEditsAsEntities.push( { | ||
editedSiteEntities.push( { | ||
kind: 'root', | ||
name: 'site', | ||
title: TRANSLATED_SITE_PROPERTIES[ property ] || property, | ||
property, | ||
} ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here it's interesting that we're looking only at the keys of siteEdits
, not the values. So, when I'm editing the site title or tagline, then, as i type, the siteEdits
change, and trigger a recalculation and rerender. But the keys don't change, only the value.
Fixing this would be a micro-optimization of a very minor use case (editing site properties), probably not worth doing. But interesting to know about 🙂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So should we just return the record keys for this one? Do we have a data selector to ensure the same value on every render?
P.S. I've another minor refactoring in mind for this hook - using reducer for the unselectedEntities
state. Happy to include this micro-optimization there if you want to pursue it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now I found that the __experimentalGetDirtyEntityRecords
selector has exactly the same problem. But this one is much more widely used. Although its return value is still the same, and although it's memoized with createSelector
, the value is recalculated on every keystroke, when changing any block. Because the memoization is invalidated on every content value change, but the content values are not used to calculate the return value.
It won't be easy to memoize this properly.
What?
This is a follow-up to #50863.
PR fixes the following warning triggered by the
useIsDirty
hook:Why?
Array operations like
filter
andmap
will return a new array on each mapSelect call. This can cause unnecessary rerenders. See #53666.How?
I moved the filtering logic outside into the
useMemo
hook. Similar to #53596.Testing Instructions
?theme_preview=[themePath]
, wherethemePath
is the relative path to the theme you want to preview (e.g.,twentytwentythree
).Screenshots or screencast
CleanShot.2023-08-17.at.14.45.40.mp4