Seb βš›οΈ ThisWeekInReact.com Profile picture
Sep 6, 2022 β€’ 13 tweets β€’ 5 min read β€’ Read on X
There are 16 hooks in React 😏 😈

And I bet you never used this one: useSyncExternalStore()

Used internally in state management libs, like Redux

But have you ever thought about using it in your own app code?

πŸ’‘ It could be useful & even prevent some React re-renders

πŸ‘‡ 🧡 Image
Let's start with a real-world problem.

Imagine you are using React-Router and call useLocation() in a few places

➑️ do some conditional rendering depending on pathname, hash, ?search query-string... Image
There are a few potential performance problems, for example:

- whenever you click on hash link, components reading only pathname will re-render ➑️ useless

- whenever you update the ?search querystring link, components reading only pathname or hash will re-render ➑️ useless
In practice, useless React re-renders might not be a problem

But still, in some cases, it can inadvertently ruin your whole app performances by triggering full page re-renders at the top of a complex tree.

➑️ Can't we do better by default?
Enter useSyncExternalStore()

The official doc doesn't make it very clear πŸ˜…

You'll find a much better example on the new beta doc site here:
beta.reactjs.org/learn/you-migh…

πŸ’‘ It turns out that the browser history can also be considered as an external data source. Image
React-Router (v5) provides us with everything we need to create a custom useHistorySelector() hook

The implementation is quite simple: Image
Now, when you click on a hash link above, the CurrentPathname component will not re-render anymore!

Using useSyncExternalStore() enables you to create your own selector system, returning only what you need to read in the React component

This prevents useless React re-renders!
There are so many external data sources that we can subscribe to, and implementing your own selector system on top might enable you to optimize React re-renders.

For example, let's consider we want to read the scrollY position of a page

We can implement this custom React hook: Image
Scroll the page and see how the components above re-render?

One re-renders much less!

πŸ’‘ Returning a narrower value also prevents useless React re-renders

Another interesting case of narrowing:

⚑️ useIsLargeScreen() > useResponsiveBreakpoint() > useViewportWidth() 🐒
I hope I convinced you to take a look at useSyncExternalStore()

IMHO this hook is underused & deserves a bit more attention

If you aren't on React 18 yet, check the use-sync-external-store shim

Also the with-selector export in case you need to return a memoized object Image
πŸŽ‰πŸŽ‰πŸŽ‰ This Week In React is back! πŸ₯³πŸ₯³πŸ₯³

πŸ†• ️Let me introduce you to a new series of interactive articles

(Yes, I am a bit tired of just sending out a list of curated React links πŸ˜… I can do more)

This thread is a sample of the very first article:

thisweekinreact.com/articles/useSy…
❀️️If you liked the thread, I'd appreciate a retweet 😜

Subscribe now!

πŸ“¨ Don't miss the next React article πŸ€—

thisweekinreact.com/revue

β€’ β€’ β€’

Missing some Tweet in this thread? You can try to force a refresh
γ€€

Keep Current with Seb βš›οΈ ThisWeekInReact.com

Seb βš›οΈ ThisWeekInReact.com Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @sebastienlorber

Mar 1, 2023
🧡 This Week In React

βš›οΈ
πŸ‘‰ Next.js
πŸ‘‰ Signals
πŸ‘‰ useSyncExternalStore
πŸ‘‰ Server Components
πŸ‘‰ TanStack Bling
πŸ‘‰ Forgetti
πŸ‘‰ Suspense Toolbox
πŸ‘‰ Module Extraction

πŸ“±
πŸ‘‰ Expo
πŸ‘‰ Reanimated
πŸ‘‰ Metro
πŸ‘‰ Restyle
πŸ‘‰ DankStyle
πŸ‘‰ RFCs

Links ➑️ thisweekinreact.com/newsletter/136

Preview πŸ‘‡ Image
🧡 Intro

Signals remained a trending topic this week
Great Next.js 12.3 release unveiling a new cache system

Also many new for React-Native!
Expo 48, Expo Router 1, Expo Image 1, Reanimated 3, Metro symlinks support!

βœ‰οΈ Subscribe by email - Much better!
πŸ‘₯ Join 17000+ readers
Next.js 12.3 was released with great new features.
Many we already knew were coming.

What surprised me most is the new caching system of Next.js leveraging Vercel infra.

Worth checking this thread + link:


"This really unlocks the Edge" Image
Read 9 tweets
Feb 27, 2023
Different perspective πŸ€ͺ

"Mutability has great positives
But thinking immutability is bad may just mean some past patterns were problematic, and not that the entirety of immutable data is bad"

useMemo/useCallback will go away someday

I can agree, but maybe the pain is only temporary?

Maybe we shouldn't throw the immutability model because of short-term difficulties, and the platform should evolve to support better the immutable UI model

Things like Records & Tuples can greatly help

"make the right technical choice, and make the right long term choice"

I think the React team still follow this today

I can understand signals are appealing right now, but is it the way you want to write code in 10 years once the platform has improved?

Read 7 tweets
Nov 2, 2022
🧡 This Week In React

πŸ‘‰ Next.js 13
πŸ‘‰ Turbopack
πŸ‘‰ Remixing Shopify
πŸ‘‰ React-Three-Fiber Journey
πŸ‘‰ Gatsby Valhalla
πŸ‘‰ Full Stack Comps
πŸ‘‰ Rive
πŸ‘‰ Storybook
πŸ‘‰ React-Query
πŸ‘‰ Docusaurus
πŸ‘‰ Asta
πŸ‘‰ Expo 47
πŸ‘‰ TypeScript 4.9
πŸ‘‰ stc

... more by email βœ‰οΈ

🧡 Details πŸ‘‡
🧡 Intro

What a week 🀯

- Next.js conf: Next.js 13 + Turbopack
- Shopify acquires Remix
- Three.js Journey goes React
- Gatsby 5 releases Valhallah

Also testing a new format, do you like it?

βœ‰οΈ Subscribe by email - Much better!

revue.thisweekinreact.com

Sneak peek below πŸ‘‡
🧡 Next.js 13 - @vercel

New app/ directory: enables the new features and latest React 18 innovations like React Server Components and streaming

Nested layouts!

Turbopack: new alpha Rust bundler

Also improves image + font + link and many other things

nextjs.org/blog/next-13
Read 24 tweets
Oct 31, 2022
I'll do a thread with all the funny tweets I gathered for my React newsletter

Too much fun to not share 🀭

Just wondering if I should exclude non-React/frontend memes?

Should I include these? πŸ‘‡

Read 6 tweets
May 4, 2022
🧡 This Week In React

πŸ‘‰ Click To Component
πŸ‘‰ Zag
πŸ‘‰ Why I don't miss React
πŸ‘‰ Next.js -> Remix
πŸ‘‰ Next.js ISR
πŸ‘‰ Next.js Router
πŸ‘‰ Component Party
πŸ‘‰ Convex
πŸ‘‰ Concurrent React
πŸ‘‰ Tilg
πŸ‘‰ RN 0.69 RC
πŸ‘‰ Expo 45
πŸ‘‰ RN-Skia, Graph
πŸ‘‰ TS Error Translator

More by βœ‰οΈ

Details πŸ‘‡ Image
🧡 Intro

Great week for React-Native: 0.69 RC, Expo 45, Skia...

New cool toys: Zag, Tilg, Click-To-Component, Convex, Component Party, TS Error Translator...

βœ‰οΈ A lot more links in the email
(a few nice TypeScript and Wasm ones)

ThisWeekInReact.com
🧡 Click To Component by @ericclemmons

Option+Click a React component in your browser to instantly open the source file πŸ‘Œ

Looks very convenient and easy to set up!

Only VS Code, but other IDE support possible
(there's already a PR for Intellij πŸ€—)

github.com/ericclemmons/c…
Read 21 tweets
Mar 23, 2022
🧡 This Week In React

πŸ‘‰ Ladle
πŸ‘‰ Preemptive memoization
πŸ‘‰ Remix Stacks
πŸ‘‰ Upgrading Next.js
πŸ‘‰ Wix // SSR
πŸ‘‰ Shopify Polaris Viz
πŸ‘‰ RTK Listener middleware
πŸ‘‰ Remix Review
πŸ‘‰ React-Spline
πŸ‘‰ React-Runner
πŸ‘‰ Storybook
πŸ‘‰ React-Native 0.68 RC3

... more by βœ‰οΈ

🧡 Details πŸ‘‡ Image
🧡 Intro

Interesting Remix and Next.js content this week

Ladle: faster Storybook

Nice React-related feedback from Shopify and Wix

React-Native: calm week, but v0.68 / Fabric is coming!

βœ‰οΈ Subscribe by email or read online (more content inside)

ThisWeekInReact.com
🧡 Ladle by @vmiksu

A drop-in alternative for Storybook

Built for Uber, solves Storybook issues at scale

Faster, modern, based on ES modules and Vite

Easy to adopt: using Component Story Format

ladle.dev/blog/introduci…

Demo: baseweb.netlify.app Image
Read 19 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(