{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/react-understadning-usememo-hooks/",
    "result": {"data":{"markdownRemark":{"html":"<h2 id=\"introduction\" style=\"position:relative;\"><a href=\"#introduction\" aria-label=\"introduction permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Introduction</h2>\n<p>If you've struggled to make sense of <code class=\"language-text\">useMemo</code> and <code class=\"language-text\">useCallback</code>, you're not alone! I've spoken with <em>so many</em> React devs who have been scratching their heads about these two hooks.</p>\n<p>My goal in this blog post is to clear up all of this confusion. We'll learn what they do, why they're useful, and how to get the most out of them.</p>\n<p>Let's go!</p>\n<p><strong>Intended audience</strong></p>\n<p>This tutorial is written to help beginner/intermediate React developers get more comfortable with React. If you're taking your very first steps with React, you might wish to bookmark this one and come back to it in a few weeks!</p>\n<h1 id=\"the-basic-idea\" style=\"position:relative;\"><a href=\"#the-basic-idea\" aria-label=\"the basic idea permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The basic idea</h1>\n<p>Alright, so let's start with <code class=\"language-text\">useMemo</code>.</p>\n<p>The fundamental idea with <code class=\"language-text\">useMemo</code> is that it allows us to <em>“remember”</em> a computed value between renders.</p>\n<p>This definition requires some unpacking. In fact, it requires a pretty sophisticated mental model of how React works! So let's address that first.</p>\n<p>The main thing that React does is keep our UI in sync with our application state. The tool that it uses to do this is called a “re-render”.</p>\n<p>Each re-render is a snapshot of what the application's UI should look like at a given moment in time, based on the current application state. We can think of it like a stack of photographs, each one capturing how things looked given a specific value for every state variable.</p>\n<p>Each “re-render” produces a mental picture of what the DOM should look like, based on the current state. In the little demo above, it's pictured as HTML, but in reality it's a bunch of JS objects. This is sometimes called the <em>“virtual DOM”</em>, if you've heard that term.</p>\n<p>We don't directly tell React which DOM nodes need to change. Instead, we tell React what the UI <em>should be</em> based on the current state. By re-rendering, React creates a new snapshot, and it can figure out what needs to change by comparing snapshots, like playing a “find the differences” game.</p>\n<p><strong>Wait, what?</strong></p>\n<p>I recently published a blog post that explains what a “re-render” is, and why they occur. If you're feeling a bit lost, it might help to read that blog post first, and then come back to this one!</p>\n<ul>\n<li><a href=\"/react/why-react-re-renders/\">“Why React Re-Renders”</a></li>\n</ul>\n<p>React is heavily optimized out of the box, and so <em>in general</em>, re-renders aren't a big deal. But, in certain situations, these snapshots <em>do</em> take a while to create. This can lead to performance problems, like the UI not updating quickly enough after the user performs an action.</p>\n<p>Fundamentally, <code class=\"language-text\">useMemo</code> and <code class=\"language-text\">useCallback</code> are tools built to help us optimize re-renders. They do this in two ways:</p>\n<ol>\n<li>\n<p>Reducing the amount of work that needs to be done in a given render.</p>\n</li>\n<li>\n<p>Reducing the number of times that a component needs to re-render.</p>\n</li>\n</ol>\n<p>Let's talk about these strategies, one at a time.</p>\n<h1 id=\"use-case-1-heavy-computations\" style=\"position:relative;\"><a href=\"#use-case-1-heavy-computations\" aria-label=\"use case 1 heavy computations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Use case 1: Heavy computations</h1>\n<p>Let's suppose we're building a tool to help users find all of the prime numbers between 0 and <code class=\"language-text\">selectedNum</code>, where <code class=\"language-text\">selectedNum</code> is a user-supplied value. A prime number is a number that can only be divided by 1 and itself, like 17.</p>\n<p>Here's one possible implementation:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">\n<span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// We hold the user's selected number in state.</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>selectedNum<span class=\"token punctuation\">,</span> setSelectedNum<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// We calculate all of the prime numbers between 0 and the</span>\n  <span class=\"token comment\">// user's chosen number, `selectedNum`:</span>\n  <span class=\"token keyword\">const</span> allPrimes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;</span> selectedNum<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      allPrimes<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>form<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>label htmlFor<span class=\"token operator\">=</span><span class=\"token string\">\"num\"</span><span class=\"token operator\">></span>Your number<span class=\"token operator\">:</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>label<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>input\n          type<span class=\"token operator\">=</span><span class=\"token string\">\"number\"</span>\n          value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>selectedNum<span class=\"token punctuation\">}</span>\n          onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// To prevent computers from exploding,</span>\n            <span class=\"token comment\">// we'll max out at 100k</span>\n            <span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">min</span><span class=\"token punctuation\">(</span><span class=\"token number\">100_000</span><span class=\"token punctuation\">,</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token function\">setSelectedNum</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>\n        There are <span class=\"token punctuation\">{</span>allPrimes<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">}</span> <span class=\"token function\">prime</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span> between <span class=\"token number\">1</span> and <span class=\"token punctuation\">{</span>selectedNum<span class=\"token punctuation\">}</span><span class=\"token operator\">:</span>\n        <span class=\"token punctuation\">{</span><span class=\"token string\">' '</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span>span className<span class=\"token operator\">=</span><span class=\"token string\">\"prime-list\"</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span>allPrimes<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Helper function that calculates whether a given</span>\n<span class=\"token comment\">// number is prime or not.</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> max <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">sqrt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">===</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;=</span> max<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">%</span> counter <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span>\n</code></pre></div>\n<p>I don't expect you to read every line of code here, so here are the relevant highlights:</p>\n<ul>\n<li>We have a single piece of state, a number called <code class=\"language-text\">selectedNum</code>.</li>\n<li>Using a <code class=\"language-text\">for</code> loop, we manually calculate all of the prime numbers between 0 and <code class=\"language-text\">selectedNum</code>.</li>\n<li>We render a controlled number input, so the user can change <code class=\"language-text\">selectedNum</code>.</li>\n<li>We show the user all of the prime numbers that we calculated.</li>\n</ul>\n<p><strong>This code requires a significant amount of computation.</strong> If the user picks a large <code class=\"language-text\">selectedNum</code>, we'll need to go through <em>tens of thousands</em> of numbers, checking if each one is prime. And, while there <em>are</em> more efficient prime-checking algorithms than the one I used above, it's always going to be computationally intensive.</p>\n<p>We do need to perform this calculation <em>sometimes</em>, like when the user picks a new <code class=\"language-text\">selectedNum</code>. But we could potentially run into some performance problems if we wind up doing this work <em>gratuitously</em>, when it doesn't need to be done.</p>\n<p>For example, let's suppose our example also features a digital clock:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> format <span class=\"token keyword\">from</span> <span class=\"token string\">'date-fns/format'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>selectedNum<span class=\"token punctuation\">,</span> setSelectedNum<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// `time` is a state variable that changes once per second,</span>\n  <span class=\"token comment\">// so that it's always in sync with the current time.</span>\n  <span class=\"token keyword\">const</span> time <span class=\"token operator\">=</span> <span class=\"token function\">useTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token comment\">// Calculate all of the prime numbers.</span>\n  <span class=\"token comment\">// (Unchanged from the earlier example.)</span>\n  <span class=\"token keyword\">const</span> allPrimes <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;</span> selectedNum<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      allPrimes<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p className<span class=\"token operator\">=</span><span class=\"token string\">\"clock\"</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">{</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">,</span> <span class=\"token string\">'hh:mm:ss a'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>form<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>label htmlFor<span class=\"token operator\">=</span><span class=\"token string\">\"num\"</span><span class=\"token operator\">></span>Your number<span class=\"token operator\">:</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>label<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>input\n          type<span class=\"token operator\">=</span><span class=\"token string\">\"number\"</span>\n          value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>selectedNum<span class=\"token punctuation\">}</span>\n          onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// To prevent computers from exploding,</span>\n            <span class=\"token comment\">// we'll max out at 100k</span>\n            <span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">min</span><span class=\"token punctuation\">(</span><span class=\"token number\">100_000</span><span class=\"token punctuation\">,</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token function\">setSelectedNum</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>\n        There are <span class=\"token punctuation\">{</span>allPrimes<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">}</span> <span class=\"token function\">prime</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span> between <span class=\"token number\">1</span> and <span class=\"token punctuation\">{</span>selectedNum<span class=\"token punctuation\">}</span><span class=\"token operator\">:</span>\n        <span class=\"token punctuation\">{</span><span class=\"token string\">' '</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span>span className<span class=\"token operator\">=</span><span class=\"token string\">\"prime-list\"</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span>allPrimes<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">useTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>time<span class=\"token punctuation\">,</span> setTime<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  React<span class=\"token punctuation\">.</span><span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> intervalId <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span><span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setTime</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      window<span class=\"token punctuation\">.</span><span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>intervalId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">return</span> time<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> max <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">sqrt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">===</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;=</span> max<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">%</span> counter <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Our application now has two pieces of state, <code class=\"language-text\">selectedNum</code> and <code class=\"language-text\">time</code>. Once per second, the <code class=\"language-text\">time</code> variable is updated to reflect the current time, and that value is used to render a digital clock in the top-right corner.</p>\n<p><strong>Here's the issue:</strong> whenever <em>either</em> of these state variables change, we re-run all of those expensive prime-number computations. And because <code class=\"language-text\">time</code> changes once per second, it means we're <em>constantly</em> re-generating that list of primes, even when the user's selected number hasn't changed!</p>\n<p>In JavaScript, we only have one main thread, and we're keeping it <em>super</em> busy by running this code over and over, every single second. It means that the application might feel sluggish as the user tries to do other things, especially on lower-end devices.</p>\n<p><strong>But what if we could “skip” these calculations?</strong> If we already have the list of primes for a given number, why not <em>re-use</em> that value instead of calculating it from scratch every time?</p>\n<p>This is precisely what <code class=\"language-text\">useMemo</code> allows us to do. Here's what it looks like:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">\n<span class=\"token keyword\">const</span> allPrimes <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useMemo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;</span> selectedNum<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      result<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>selectedNum<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> allPrimes <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useMemo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;</span> selectedNum<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n      result<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token punctuation\">}</span>\n\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>selectedNum<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre></div>\n<h1 id=\"usememo-takes-two-arguments\" style=\"position:relative;\"><a href=\"#usememo-takes-two-arguments\" aria-label=\"usememo takes two arguments permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a><code class=\"language-text\">useMemo</code> takes two arguments:</h1>\n<ol>\n<li>A chunk of work to be performed, wrapped up in a function</li>\n<li>A list of dependencies</li>\n</ol>\n<p>During mount, when this component is rendered for the very first time, React will invoke this function to run all of this logic, calculating all of the primes. <strong>Whatever we return from this function is assigned to the <code class=\"language-text\">allPrimes</code> variable.</strong></p>\n<p>For every subsequent render, however, <strong>React has a choice to make.</strong> Should it:</p>\n<ol>\n<li>Invoke the function again, to re-calculate the value, or</li>\n<li>Re-use the data it already has, from the <em>last</em> time it did this work.</li>\n</ol>\n<p>To answer this question, React looks at the supplied list of dependencies. Have any of them changed since the previous render? If so, React will rerun the supplied function, to calculate a new value. Otherwise, it'll skip all that work and reuse the previously-calculated value.</p>\n<p><strong><code class=\"language-text\">useMemo</code> is essentially like a lil’ cache, and the dependencies are the cache invalidation strategy.</strong></p>\n<p>In this case, we're essentially saying “recalculate the list of primes <em>only when</em> <code class=\"language-text\">selectedNum</code> changes”. When the component re-renders for <em>other</em> reasons (eg. the <code class=\"language-text\">time</code> state variable changing), <code class=\"language-text\">useMemo</code> ignores the function and passes along the cached value.</p>\n<p>This is commonly known as <em>memoization</em>, and it's why this hook is called “useMemo”.</p>\n<p>Here's a live version of this solution:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> format <span class=\"token keyword\">from</span> <span class=\"token string\">'date-fns/format'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>selectedNum<span class=\"token punctuation\">,</span> setSelectedNum<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> time <span class=\"token operator\">=</span> <span class=\"token function\">useTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">const</span> allPrimes <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useMemo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> result <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;</span> selectedNum<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        result<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>counter<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token keyword\">return</span> result<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>selectedNum<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p className<span class=\"token operator\">=</span><span class=\"token string\">\"clock\"</span><span class=\"token operator\">></span>\n        <span class=\"token punctuation\">{</span><span class=\"token function\">format</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">,</span> <span class=\"token string\">'hh:mm:ss a'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>form<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>label htmlFor<span class=\"token operator\">=</span><span class=\"token string\">\"num\"</span><span class=\"token operator\">></span>Your number<span class=\"token operator\">:</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>label<span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>input\n          type<span class=\"token operator\">=</span><span class=\"token string\">\"number\"</span>\n          value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>selectedNum<span class=\"token punctuation\">}</span>\n          onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// To prevent computers from exploding,</span>\n            <span class=\"token comment\">// we'll max out at 100k</span>\n            <span class=\"token keyword\">let</span> num <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">min</span><span class=\"token punctuation\">(</span><span class=\"token number\">100_000</span><span class=\"token punctuation\">,</span> <span class=\"token function\">Number</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            \n            <span class=\"token function\">setSelectedNum</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>\n        There are <span class=\"token punctuation\">{</span>allPrimes<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">}</span> <span class=\"token function\">prime</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span> between <span class=\"token number\">1</span> and <span class=\"token punctuation\">{</span>selectedNum<span class=\"token punctuation\">}</span><span class=\"token operator\">:</span>\n        <span class=\"token punctuation\">{</span><span class=\"token string\">' '</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span>span className<span class=\"token operator\">=</span><span class=\"token string\">\"prime-list\"</span><span class=\"token operator\">></span>\n          <span class=\"token punctuation\">{</span>allPrimes<span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">', '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">useTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>time<span class=\"token punctuation\">,</span> setTime<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  React<span class=\"token punctuation\">.</span><span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> intervalId <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span><span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setTime</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      window<span class=\"token punctuation\">.</span><span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>intervalId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">return</span> time<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">isPrime</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">n</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> max <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">sqrt</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">===</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  \n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> counter <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> counter <span class=\"token operator\">&lt;=</span> max<span class=\"token punctuation\">;</span> counter<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">%</span> counter <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<h1 id=\"an-alternative-approach\" style=\"position:relative;\"><a href=\"#an-alternative-approach\" aria-label=\"an alternative approach permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>An alternative approach</h1>\n<p>So, the <code class=\"language-text\">useMemo</code> hook can indeed help us avoid unnecessary calculations here… but is it <em>really</em> the best solution here?</p>\n<p>Often, we can avoid the need for <code class=\"language-text\">useMemo</code> by restructuring things in our application.</p>\n<p>Here's one way we could do this:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> Clock <span class=\"token keyword\">from</span> <span class=\"token string\">'./Clock'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PrimeCalculator <span class=\"token keyword\">from</span> <span class=\"token string\">'./PrimeCalculator'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Clock <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>PrimeCalculator <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<p>I've extracted two new components, <code class=\"language-text\">Clock</code> and <code class=\"language-text\">PrimeCalculator</code>. By branching off from <code class=\"language-text\">App</code>, these two components each manage their own state. A re-render in one component won't affect the other.</p>\n<p>Here's a graph showing this dynamic. Each box represents a component instance, and they flash when they re-render. Try clicking the “Increment” button to see it in action:</p>\n<p>We hear a lot about lifting state up, but sometimes, the better approach is to <em>push state down!</em> Each component should have a single responsibility, and in the example above, <code class=\"language-text\">App</code> was doing two totally-unrelated things.</p>\n<p>Now, this won't always be an option. In a large, real-world app, there's lots of state that <em>needs</em> to be lifted up pretty high, and can't be pushed down.</p>\n<p><strong>I have another trick up my sleeves for this situation.</strong></p>\n<p>Let's look at an example. Suppose we <strong>need</strong> the <code class=\"language-text\">time</code> variable to be lifted up, above <code class=\"language-text\">PrimeCalculator</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> getHours <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'date-fns'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> Clock <span class=\"token keyword\">from</span> <span class=\"token string\">'./Clock'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> PrimeCalculator <span class=\"token keyword\">from</span> <span class=\"token string\">'./PrimeCalculator'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Transform our PrimeCalculator into a pure component:</span>\n<span class=\"token keyword\">const</span> PurePrimeCalculator <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">memo</span><span class=\"token punctuation\">(</span>PrimeCalculator<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">App</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> time <span class=\"token operator\">=</span> <span class=\"token function\">useTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Come up with a suitable background color,</span>\n  <span class=\"token comment\">// based on the time of day:</span>\n  <span class=\"token keyword\">const</span> backgroundColor <span class=\"token operator\">=</span> <span class=\"token function\">getBackgroundColorFromTime</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> backgroundColor <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Clock time<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>time<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>PurePrimeCalculator <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getBackgroundColorFromTime</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> hours <span class=\"token operator\">=</span> <span class=\"token function\">getHours</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>hours <span class=\"token operator\">&lt;</span> <span class=\"token number\">12</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// A light yellow for mornings</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'hsl(50deg 100% 90%)'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>hours <span class=\"token operator\">&lt;</span> <span class=\"token number\">18</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Dull blue in the afternoon</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'hsl(220deg 60% 92%)'</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Deeper blue at night</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'hsl(220deg 100% 80%)'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">useTime</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>time<span class=\"token punctuation\">,</span> setTime<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  React<span class=\"token punctuation\">.</span><span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> intervalId <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span><span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setTime</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      window<span class=\"token punctuation\">.</span><span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>intervalId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">return</span> time<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<h1 id=\"pure-component\" style=\"position:relative;\"><a href=\"#pure-component\" aria-label=\"pure component permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Pure Component</h1>\n<p>Like a force field, <code class=\"language-text\">React.memo</code> wraps around our component and protects it from unrelated updates. Our <code class=\"language-text\">PurePrimeCalculator</code> will only re-render when it receives new data, or when its internal state changes.</p>\n<p>This is known as a <em>pure component</em>. Essentially, we're telling React that this component will always produce the same <em>output</em> given the same <em>input</em>, and we can skip the re-renders where nothing's changed.</p>\n<p>I wrote more about how <code class=\"language-text\">React.memo</code> works in my recent blog post, <a href=\"/react/why-react-re-renders/\">“Why React Re-Renders”</a>.</p>\n<p><strong>A more conventional approach</strong></p>\n<p>In the example above, I'm applying <code class=\"language-text\">React.memo</code> to the <em>imported</em> <code class=\"language-text\">PrimeCalculator</code> component.</p>\n<p>In truth, this is a bit unusual. I chose to structure it this way so that everything was visible in the same file, to make it easier to understand.</p>\n<p>In practice, I often apply <code class=\"language-text\">React.memo</code> to the component <em>export</em>, like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// PrimeCalculator.js</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">PrimeCalculator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/* Component stuff here */</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">memo</span><span class=\"token punctuation\">(</span>PrimeCalculator<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// PrimeCalculator.js</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">PrimeCalculator</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\">/* Component stuff here */</span>\n\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">memo</span><span class=\"token punctuation\">(</span>PrimeCalculator<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Our <code class=\"language-text\">PrimeCalculator</code> component will now always be pure, without us having to tinker with it when we go to consume it.</p>\n<p>Should we ever need a non-pure version of <code class=\"language-text\">PrimeCalculator</code>, we can export the underlying component as a named export. I don't think I've ever needed to do this though.</p>\n<p><strong>There's an interesting perspective-shift here:</strong> Before, we were memoizing the result of a specific computation, calculating the prime numbers. In this case, however, <em>I've memoized the entire component instead.</em></p>\n<p>Either way, the expensive calculation stuff will only re-run when the user picks a new <code class=\"language-text\">selectedNum</code>. But we've optimized the parent component rather than the specific slow lines of code.</p>\n<p>I'm not saying that one approach is better than the other; each tool has its spot in the toolbox. But in this specific case, I prefer this approach.</p>\n<p>Now, if you've ever tried to use pure components in a real-world setting, you've likely noticed something peculiar: <strong>Pure components often re-render quite a bit,</strong> even when it seems like nothing's changed! 😬</p>\n<p>This leads us nicely into the second problem that <code class=\"language-text\">useMemo</code> solves.</p>\n<p><strong>Even more alternatives</strong></p>\n<p>In his blog post <a href=\"https://overreacted.io/before-you-memo/\">“Before you memo()”</a>, Dan Abramov shares another approach based around restructuring the app using <code class=\"language-text\">children</code>, to avoid needing to do any memoization.</p>","excerpt":"Introduction If you've struggled to make sense of  and , you're not alone! I've spoken with so many React devs who have been scratching…","fields":{"slug":"/react-understadning-usememo-hooks/"},"frontmatter":{"title":"Understand Mystery behind useMemo Hook","date":"April 01, 2024","tags":["web-design","reactjs","a11y"],"description":"Understand Mystery behind useMemo Hook"}}},"pageContext":{"slug":"/react-understadning-usememo-hooks/","previous":{"id":"a4e2a4aa-8ac2-5c5f-9448-4b80992b3788","frontmatter":{"title":"Build design system with reactjs","tags":["web-design","reactjs","a11y"],"categories":["a11y","reactjs","web-design"],"template":"post"},"fields":{"slug":"/build-design-system-with-reactjs/"}},"next":{"id":"99bc8950-77bc-5676-b7aa-2beb0edf9a7c","frontmatter":{"title":"Learn web development with tkssharma","tags":["tkssharma","utube","nodejs","react"],"categories":["tkssharma","aws","nodejs","utube","microservices","react"],"template":"post"},"fields":{"slug":"/learn-web-development-with-code-with-tkssharma/"}}}},
    "staticQueryHashes": ["352937542"]}