{"componentChunkName":"component---src-templates-post-js","path":"/blog/2019/10/06/react-hooks-should-know/","result":{"data":{"post":{"html":"<p><a href=\"https://reactjs.org/docs/hooks-overview.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Hooks</a> are somewhat a new addition to React. They allow you to use React features without the need to use a class. But I am not going to go through an introduction in this post, there are many great into posts out there. This post shows you eight hooks and what you can achieve with them.</p>\n<!--more-->\n<h2 id=\"code-classlanguage-textreact-use-form-statecode-hook\" style=\"position:relative;\"><a href=\"#code-classlanguage-textreact-use-form-statecode-hook\" aria-label=\"code classlanguage textreact use form statecode hook 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\">react-use-form-state</code> hook</h2>\n<p>Forms are a very common pattern when it comes to getting information from users. From small to large forms, they all have their own state we have to manage, whether it’s for validation or to populate another input based on previous selection.</p>\n<p>This hook is a handy tool which allows you simplify managing form’s state using the native HTML input fields.</p>\n<p>You can install it with:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"26010539271521305000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`npm i react-use-form-state`, `26010539271521305000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i react-use-form-state</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>And a simple usage:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"82936531280365370000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useFormState } from 'react-use-form-state';\r\n \r\nexport default function SignUpForm({ onSubmit }) {\r\n  const [formState, { text, email, password, radio }] = useFormState();\r\n \r\n  function handleSubmit(e) {\r\n    // ...\r\n  }\r\n \r\n  return (\r\n    <form onSubmit={handleSubmit}>\r\n      <input {...text('name')} />\r\n      <input {...email('email')} required />\r\n      <input {...password('password')} required minLength=&quot;8&quot; />\r\n      <input {...radio('plan', 'free')} />\r\n      <input {...radio('plan', 'premium')} />\r\n    </form>\r\n  );\r\n}`, `82936531280365370000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useFormState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-use-form-state'</span><span class=\"token punctuation\">;</span>\r\n \r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">SignUpForm</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> onSubmit <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>formState<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> text<span class=\"token punctuation\">,</span> email<span class=\"token punctuation\">,</span> password<span class=\"token punctuation\">,</span> radio <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useFormState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n \r\n  <span class=\"token keyword\">function</span> <span class=\"token function\">handleSubmit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token comment\">// ...</span>\r\n  <span class=\"token punctuation\">}</span>\r\n \r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>form onSubmit<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>handleSubmit<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>input <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token string\">'name'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>input <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">email</span><span class=\"token punctuation\">(</span><span class=\"token string\">'email'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> required <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>input <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">password</span><span class=\"token punctuation\">(</span><span class=\"token string\">'password'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> required minLength<span class=\"token operator\">=</span><span class=\"token string\">\"8\"</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>input <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">radio</span><span class=\"token punctuation\">(</span><span class=\"token string\">'plan'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'free'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>input <span class=\"token punctuation\">{</span><span class=\"token operator\">...</span><span class=\"token function\">radio</span><span class=\"token punctuation\">(</span><span class=\"token string\">'plan'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'premium'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>form<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>With this you get a <code class=\"language-text\">json</code> structure like this:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"74599863972710250000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`{\r\n  values: {\r\n    name: 'Mary Poppins',\r\n    email: 'mary@example.com',\r\n    password: '1234',\r\n    plan: 'free',\r\n  },\r\n  touched: {\r\n    name: true,\r\n    email: true,\r\n    password: true,\r\n    plan: true,\r\n  },\r\n  validity: {\r\n    name: true,\r\n    email: true,\r\n    password: false,\r\n    plan: true,\r\n  },\r\n  errors: {\r\n    password: 'Please lengthen this text to 8 characters or more',\r\n  },\r\n  clear: Function,\r\n  clearField: Function,\r\n  reset: Function,\r\n  resetField: Function,\r\n  setField: Function,\r\n}`, `74599863972710250000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token punctuation\">{</span>\r\n  <span class=\"token literal-property property\">values</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'Mary Poppins'</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">'mary@example.com'</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> <span class=\"token string\">'1234'</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">plan</span><span class=\"token operator\">:</span> <span class=\"token string\">'free'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">touched</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">plan</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">validity</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">email</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">plan</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">errors</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">password</span><span class=\"token operator\">:</span> <span class=\"token string\">'Please lengthen this text to 8 characters or more'</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">clear</span><span class=\"token operator\">:</span> Function<span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">clearField</span><span class=\"token operator\">:</span> Function<span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">reset</span><span class=\"token operator\">:</span> Function<span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">resetField</span><span class=\"token operator\">:</span> Function<span class=\"token punctuation\">,</span>\r\n  <span class=\"token literal-property property\">setField</span><span class=\"token operator\">:</span> Function<span class=\"token punctuation\">,</span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>It also allow you to initialise it via <code class=\"language-text\">initialState</code> object, a wide variety of on form event handlers, advanced input options, custom input validation, custom controls and much more. Definitely check their <a href=\"https://github.com/wsmd/react-use-form-state\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub Repo</a> for more information.</p>\n<h2 id=\"code-classlanguage-textuse-mediacode\" style=\"position:relative;\"><a href=\"#code-classlanguage-textuse-mediacode\" aria-label=\"code classlanguage textuse mediacode 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\">use-media</code></h2>\n<p>This tiny hook is really handy if you’re trying to deliver a responsive user experience. It tracks the state of a CSS media query and lets you act on that.</p>\n<p>With <code class=\"language-text\">useEffect</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"13204470807448310000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import useMedia from 'use-media';\r\n// Alternatively, you can import as:\r\n// import {useMedia} from 'use-media';\r\n\r\nconst Demo = () => {\r\n  // Accepts an object of features to test\r\n  const isWide = useMedia({minWidth: 1000});\r\n  // Or a regular media query string\r\n  const reduceMotion = useMedia('(prefers-reduced-motion: reduce)');\r\n\r\n  return (\r\n    <div>\r\n      Screen is wide: {isWide ? '😃' : '😢'}\r\n    </div>\r\n  );\r\n};`, `13204470807448310000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> useMedia <span class=\"token keyword\">from</span> <span class=\"token string\">'use-media'</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token comment\">// Alternatively, you can import as:</span>\r\n<span class=\"token comment\">// import {useMedia} from 'use-media';</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Demo</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token comment\">// Accepts an object of features to test</span>\r\n  <span class=\"token keyword\">const</span> isWide <span class=\"token operator\">=</span> <span class=\"token function\">useMedia</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">minWidth</span><span class=\"token operator\">:</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token comment\">// Or a regular media query string</span>\r\n  <span class=\"token keyword\">const</span> reduceMotion <span class=\"token operator\">=</span> <span class=\"token function\">useMedia</span><span class=\"token punctuation\">(</span><span class=\"token string\">'(prefers-reduced-motion: reduce)'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n      Screen is wide<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>isWide <span class=\"token operator\">?</span> <span class=\"token string\">'😃'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'😢'</span><span class=\"token punctuation\">}</span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>With <code class=\"language-text\">useLayoutEffect</code>:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"21383007314889822000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import {useMediaLayout} from 'use-media';\r\n\r\nconst Demo = () => {\r\n  // Accepts an object of features to test\r\n  const isWide = useMediaLayout({minWidth: 1000});\r\n  // Or a regular media query string\r\n  const reduceMotion = useMediaLayout('(prefers-reduced-motion: reduce)');\r\n\r\n  return (\r\n    <div>\r\n      Screen is wide: {isWide ? '😃' : '😢'}\r\n    </div>\r\n  );\r\n};`, `21383007314889822000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>useMediaLayout<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'use-media'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Demo</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token comment\">// Accepts an object of features to test</span>\r\n  <span class=\"token keyword\">const</span> isWide <span class=\"token operator\">=</span> <span class=\"token function\">useMediaLayout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">minWidth</span><span class=\"token operator\">:</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token comment\">// Or a regular media query string</span>\r\n  <span class=\"token keyword\">const</span> reduceMotion <span class=\"token operator\">=</span> <span class=\"token function\">useMediaLayout</span><span class=\"token punctuation\">(</span><span class=\"token string\">'(prefers-reduced-motion: reduce)'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n      Screen is wide<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>isWide <span class=\"token operator\">?</span> <span class=\"token string\">'😃'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'😢'</span><span class=\"token punctuation\">}</span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>For more information about this nifty little hook, visit <a href=\"https://github.com/streamich/use-media\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this GitHub repo</a>.</p>\n<h2 id=\"code-classlanguage-textreact-firebase-hookscode\" style=\"position:relative;\"><a href=\"#code-classlanguage-textreact-firebase-hookscode\" aria-label=\"code classlanguage textreact firebase hookscode 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\">react-firebase-hooks</code></h2>\n<p>I don’t have to tell you how great firebase is, but what if you could use a set of hooks to easily integrate with it? It’s got 4 set of hooks for you to use:</p>\n<ul>\n<li><a href=\"https://github.com/CSFrequency/react-firebase-hooks/tree/master/auth\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Auth Hooks</a></li>\n<li><a href=\"https://github.com/CSFrequency/react-firebase-hooks/tree/master/firestore\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cloud Firestore Hooks</a></li>\n<li><a href=\"https://github.com/CSFrequency/react-firebase-hooks/tree/master/storage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Cloud Storage Hooks</a></li>\n<li><a href=\"https://github.com/CSFrequency/react-firebase-hooks/tree/master/database\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Realtime Database Hooks</a></li>\n</ul>\n<p>Usage:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"58512455352056800000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import { useAuthState } from 'react-firebase-hooks/auth';\r\n\r\nconst CurrentUser = () => {\r\n  const [user, initialising, error] = useAuthState(firebase.auth());\r\n  const login = () => {\r\n    firebase.auth().signInWithEmailAndPassword('test@test.com', 'password');\r\n  };\r\n  const logout = () => {\r\n    firebase.auth().signOut();\r\n  };\r\n\r\n  if (initialising) {\r\n    return (\r\n      <div>\r\n        <p>Initialising User...</p>\r\n      </div>\r\n    );\r\n  }\r\n  if (error) {\r\n    return (\r\n      <div>\r\n        <p>Error: {error}</p>\r\n      </div>\r\n    );\r\n  }\r\n  if (user) {\r\n    return (\r\n      <div>\r\n        <p>Current User: {user.email}</p>\r\n        <button onClick={logout}>Log out</button>\r\n      </div>\r\n    );\r\n  }\r\n  return <button onClick={login}>Log in</button>;\r\n};`, `58512455352056800000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useAuthState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-firebase-hooks/auth'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">CurrentUser</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>user<span class=\"token punctuation\">,</span> initialising<span class=\"token punctuation\">,</span> error<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useAuthState</span><span class=\"token punctuation\">(</span>firebase<span class=\"token punctuation\">.</span><span class=\"token function\">auth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">login</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n    firebase<span class=\"token punctuation\">.</span><span class=\"token function\">auth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">signInWithEmailAndPassword</span><span class=\"token punctuation\">(</span><span class=\"token string\">'test@test.com'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'password'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">logout</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n    firebase<span class=\"token punctuation\">.</span><span class=\"token function\">auth</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">signOut</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>initialising<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Initialising User<span class=\"token operator\">...</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Error<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>error<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>user<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>p<span class=\"token operator\">></span>Current User<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>user<span class=\"token punctuation\">.</span>email<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>p<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>logout<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>Log out<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>login<span class=\"token punctuation\">}</span><span class=\"token operator\">></span>Log <span class=\"token keyword\">in</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Of course you don’t hard code your username and password right? 😁</p>\n<p>Find out more <a href=\"https://github.com/CSFrequency/react-firebase-hooks\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">here</a>.</p>\n<h2 id=\"code-classlanguage-textuse-onclickoutsidecode-hook\" style=\"position:relative;\"><a href=\"#code-classlanguage-textuse-onclickoutsidecode-hook\" aria-label=\"code classlanguage textuse onclickoutsidecode hook 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\">use-onClickOutside</code> hook</h2>\n<p>Many times has happened for me to need to be aware of when the user clicks outside of an element. This might be to change something or perform an action. This little hook allows you to do exactly that:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"48091731612314330000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import * as React from 'react'\r\nimport useOnClickOutside from 'use-onclickoutside'\r\n\r\nexport default function Modal({ close }) {\r\n  const ref = React.useRef(null)\r\n  useOnClickOutside(ref, close)\r\n\r\n  return <div ref={ref}>{'Modal content'}</div>\r\n}`, `48091731612314330000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token operator\">*</span> <span class=\"token keyword\">as</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span>\r\n<span class=\"token keyword\">import</span> useOnClickOutside <span class=\"token keyword\">from</span> <span class=\"token string\">'use-onclickoutside'</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">Modal</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> close <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> ref <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">useRef</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span>\r\n  <span class=\"token function\">useOnClickOutside</span><span class=\"token punctuation\">(</span>ref<span class=\"token punctuation\">,</span> close<span class=\"token punctuation\">)</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div ref<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>ref<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token punctuation\">{</span><span class=\"token string\">'Modal content'</span><span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>As you can see, you can provide a ref to an element and pass it to the hook. If there is a click anywhere outside of the element, the the call-back function, in this case <code class=\"language-text\">close</code> is called.</p>\n<p>Find out more about this hook <a href=\"https://github.com/Andarist/use-onclickoutside\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">in this GitHub repo</a>.</p>\n<h2 id=\"code-classlanguage-textuseintersectionobservercode-hook\" style=\"position:relative;\"><a href=\"#code-classlanguage-textuseintersectionobservercode-hook\" aria-label=\"code classlanguage textuseintersectionobservercode hook 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\">useIntersectionObserver</code> hook</h2>\n<p>You might remember I did a <a href=\"https://yashints.dev/blog/2018/11/12/web-perf-4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">post on image optimisation</a> and how <code class=\"language-text\">IntersectionObserver</code> API is a handy tool to load an image lazily when it appears on viewport.</p>\n<p>This hook allows you to use this great API:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"77055205944143920000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React, { useRef, useState } from &quot;react&quot;;\r\nimport { useIntersectionObserver } from &quot;react-hook-intersection-observer&quot;;\r\n\r\nconst App = () => {\r\n  const root = useRef();    // We need a ref to our &quot;root&quot; or our parent,\r\n  const target = useRef();  // We need a ref to our &quot;target&quot; or our child-to-watch,\r\n\r\n  // Let's use a bit of state.\r\n  const [isThingIntersecting, setThingIntersecting] = useState(false);\r\n\r\n  // Here's our hook! Let's give it some configuration...\r\n  useIntersectionObserver({\r\n    root,\r\n    target,\r\n\r\n    // What do we do when it intersects?\r\n    // The signature of this callback is (collectionOfIntersections, observerElement).\r\n    onIntersect: ([{ isIntersecting }]) => setThingIntersecting(isIntersecting)\r\n  });\r\n\r\n  return (\r\n    <div className=&quot;App&quot;>\r\n      <h1>useIntersectionObserver</h1>\r\n      <h2>\r\n        The thing is currently{&quot; &quot;}\r\n\r\n        {!isThingIntersecting && <span style={{ color: &quot;red&quot; }}>not</span>}{&quot; &quot;}\r\n\r\n        <span style={{ color: isThingIntersecting ? &quot;green&quot; : &quot;black&quot; }}>\r\n          intersecting\r\n        </span>\r\n\r\n        !\r\n      </h2>\r\n\r\n\r\n      <div ref={root} className=&quot;black-box&quot;>\r\n        <div className=&quot;larger-box&quot;>\r\n          <div ref={target}>THE THING</div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};`, `77055205944143920000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> useRef<span class=\"token punctuation\">,</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useIntersectionObserver <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react-hook-intersection-observer\"</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> root <span class=\"token operator\">=</span> <span class=\"token function\">useRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// We need a ref to our \"root\" or our parent,</span>\r\n  <span class=\"token keyword\">const</span> target <span class=\"token operator\">=</span> <span class=\"token function\">useRef</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// We need a ref to our \"target\" or our child-to-watch,</span>\r\n\r\n  <span class=\"token comment\">// Let's use a bit of state.</span>\r\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>isThingIntersecting<span class=\"token punctuation\">,</span> setThingIntersecting<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token comment\">// Here's our hook! Let's give it some configuration...</span>\r\n  <span class=\"token function\">useIntersectionObserver</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\r\n    root<span class=\"token punctuation\">,</span>\r\n    target<span class=\"token punctuation\">,</span>\r\n\r\n    <span class=\"token comment\">// What do we do when it intersects?</span>\r\n    <span class=\"token comment\">// The signature of this callback is (collectionOfIntersections, observerElement).</span>\r\n    <span class=\"token function-variable function\">onIntersect</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> isIntersecting <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">setThingIntersecting</span><span class=\"token punctuation\">(</span>isIntersecting<span class=\"token punctuation\">)</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"App\"</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>h1<span class=\"token operator\">></span>useIntersectionObserver<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h1<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>h2<span class=\"token operator\">></span>\r\n        The thing is currently<span class=\"token punctuation\">{</span><span class=\"token string\">\" \"</span><span class=\"token punctuation\">}</span>\r\n\r\n        <span class=\"token punctuation\">{</span><span class=\"token operator\">!</span>isThingIntersecting <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">&lt;</span>span style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">color</span><span class=\"token operator\">:</span> <span class=\"token string\">\"red\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>not<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">{</span><span class=\"token string\">\" \"</span><span class=\"token punctuation\">}</span>\r\n\r\n        <span class=\"token operator\">&lt;</span>span style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">color</span><span class=\"token operator\">:</span> isThingIntersecting <span class=\"token operator\">?</span> <span class=\"token string\">\"green\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"black\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span>\r\n          intersecting\r\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\r\n\r\n        <span class=\"token operator\">!</span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>h2<span class=\"token operator\">></span>\r\n\r\n\r\n      <span class=\"token operator\">&lt;</span>div ref<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>root<span class=\"token punctuation\">}</span> className<span class=\"token operator\">=</span><span class=\"token string\">\"black-box\"</span><span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>div className<span class=\"token operator\">=</span><span class=\"token string\">\"larger-box\"</span><span class=\"token operator\">></span>\r\n          <span class=\"token operator\">&lt;</span>div ref<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>target<span class=\"token punctuation\">}</span><span class=\"token operator\">></span><span class=\"token constant\">THE</span> <span class=\"token constant\">THING</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>To find out more, have a look at <a href=\"https://github.com/TejasQ/react-hook-intersection-observer\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this GitHub repo</a>.</p>\n<h2 id=\"react-use-collection\" style=\"position:relative;\"><a href=\"#react-use-collection\" aria-label=\"react use collection 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>react use collection</h2>\n<p>This is a collection of some great hooks you can use in categories like <strong>Sensors</strong>, <strong>UI</strong>, <strong>Animations</strong>, <strong>Side-effects</strong>, <strong>Lifecycles</strong>, and <strong>State</strong>.</p>\n<p>An example is <code class=\"language-text\">useLocation</code> which gives you the ability to access the location of the browser.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"47050759483854730000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import {useLocation} from 'react-use';\r\n\r\nconst Demo = () => {\r\n  const state = useLocation();\r\n\r\n  return (\r\n    <pre>\r\n      {JSON.stringify(state, null, 2)}\r\n    </pre>\r\n  );\r\n};`, `47050759483854730000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>useLocation<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-use'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Demo</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> state <span class=\"token operator\">=</span> <span class=\"token function\">useLocation</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>pre<span class=\"token operator\">></span>\r\n      <span class=\"token punctuation\">{</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>state<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>pre<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>If you’re using Internet Explorer (but why 😂), you can use <a href=\"https://github.com/streamich/react-use/issues/73\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this polyfill</a>.</p>\n<p>Or you can use <code class=\"language-text\">useBattery</code> to track the battery status on a mobile device:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"18318719595263010000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import {useBattery} from 'react-use';\r\n\r\nconst Demo = () => {\r\n  const batteryState = useBattery();\r\n\r\n  if (!batteryState.isSupported) {\r\n    return (\r\n      <div>\r\n        <strong>Battery sensor</strong>: <span>not supported</span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  if (!batteryState.fetched) {\r\n    return (\r\n      <div>\r\n        <strong>Battery sensor</strong>: <span>supported</span> <br />\r\n        <strong>Battery state</strong>: <span>fetching</span>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div>\r\n      <strong>Battery sensor</strong>:&nbsp;&nbsp; <span>supported</span> <br />\r\n      <strong>Battery state</strong>: <span>fetched</span> <br />\r\n      <strong>Charge level</strong>:&nbsp;&nbsp; <span>{ (batteryState.level * 100).toFixed(0) }%</span> <br />\r\n      <strong>Charging</strong>:&nbsp;&nbsp; <span>{ batteryState.charging ? 'yes' : 'no' }</span> <br />\r\n      <strong>Charging time</strong>:&nbsp;&nbsp;\r\n      <span>{ batteryState.chargingTime ? batteryState.chargingTime : 'finished' }</span> <br />\r\n      <strong>Discharging time</strong>:&nbsp;&nbsp; <span>{ batteryState.dischargingTime }</span>\r\n    </div>\r\n  );\r\n};`, `18318719595263010000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>useBattery<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-use'</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Demo</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> batteryState <span class=\"token operator\">=</span> <span class=\"token function\">useBattery</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>batteryState<span class=\"token punctuation\">.</span>isSupported<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Battery sensor<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>not supported<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>batteryState<span class=\"token punctuation\">.</span>fetched<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n      <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Battery sensor<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>supported<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>br <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n        <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Battery state<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>fetching<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token punctuation\">}</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Battery sensor<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>supported<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>br <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Battery state<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span>fetched<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>br <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Charge level<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span> <span class=\"token punctuation\">(</span>batteryState<span class=\"token punctuation\">.</span>level <span class=\"token operator\">*</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toFixed</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span><span class=\"token operator\">%</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>br <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Charging<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span> batteryState<span class=\"token punctuation\">.</span>charging <span class=\"token operator\">?</span> <span class=\"token string\">'yes'</span> <span class=\"token operator\">:</span> <span class=\"token string\">'no'</span> <span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>br <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Charging time<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span>\r\n      <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span> batteryState<span class=\"token punctuation\">.</span>chargingTime <span class=\"token operator\">?</span> batteryState<span class=\"token punctuation\">.</span>chargingTime <span class=\"token operator\">:</span> <span class=\"token string\">'finished'</span> <span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span> <span class=\"token operator\">&lt;</span>br <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>strong<span class=\"token operator\">></span>Discharging time<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>strong<span class=\"token operator\">></span><span class=\"token operator\">:</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span><span class=\"token operator\">&amp;</span>nbsp<span class=\"token punctuation\">;</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">{</span> batteryState<span class=\"token punctuation\">.</span>dischargingTime <span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>To find out about all of those, check <a href=\"https://github.com/streamich/react-use\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this GitHub repo</a>.</p>\n<h2 id=\"react-redux-hooks\" style=\"position:relative;\"><a href=\"#react-redux-hooks\" aria-label=\"react redux hooks 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>React Redux hooks</h2>\n<p>React Redux now offers a set of hook APIs as an alternative to the existing <code class=\"language-text\">connect()</code> Higher Order Component. These APIs allow you to subscribe to the Redux store and dispatch actions, without having to wrap your components in <code class=\"language-text\">connect()</code>.</p>\n<p>Here is the <code class=\"language-text\">useSelector</code> hook returns a part of all of store using a selector function.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"97677906444083860000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React from 'react'\r\nimport { useSelector } from 'react-redux'\r\n\r\nexport const CounterComponent = () => {\r\n  const counter = useSelector(state => state.counter)\r\n  return <div>{counter}</div>\r\n}`, `97677906444083860000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span>\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useSelector <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react-redux'</span>\r\n\r\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">CounterComponent</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> counter <span class=\"token operator\">=</span> <span class=\"token function\">useSelector</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span> <span class=\"token operator\">=></span> state<span class=\"token punctuation\">.</span>counter<span class=\"token punctuation\">)</span>\r\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span><span class=\"token punctuation\">{</span>counter<span class=\"token punctuation\">}</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Checkout <a href=\"https://react-redux.js.org/next/api/hooks\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">their comprehensive documentation</a> to find out more.</p>\n<h2 id=\"react-hanger\" style=\"position:relative;\"><a href=\"#react-hanger\" aria-label=\"react hanger 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>react-hanger</h2>\n<p>A set of helpful hooks with focus on primitive types state changing. They have two version, but the recommendation is to use V2.</p>\n<p>Install:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"4984913401478863000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`yarn add react-hanger`, `4984913401478863000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\"><span class=\"token function\">yarn</span> <span class=\"token function\">add</span> react-hanger</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Usage:</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"68861928885957720000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied to clipboard ✅\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import React, { Component } from &quot;react&quot;;\r\n\r\nimport {\r\n  useInput,\r\n  useBoolean,\r\n  useNumber,\r\n  useArray,\r\n  useOnMount,\r\n  useOnUnmount\r\n} from &quot;react-hanger&quot;;\r\n\r\nconst App = () => {\r\n  const newTodo = useInput(&quot;&quot;);\r\n  const showCounter = useBoolean(true);\r\n  const limitedNumber = useNumber(3, { lowerLimit: 0, upperLimit: 5 });\r\n  const counter = useNumber(0);\r\n  const todos = useArray([&quot;hi there&quot;, &quot;sup&quot;, &quot;world&quot;]);\r\n\r\n  const rotatingNumber = useNumber(0, {\r\n    lowerLimit: 0,\r\n    upperLimit: 4,\r\n    loop: true\r\n  });\r\n\r\n  return (\r\n    <div>\r\n      <button onClick={showCounter.toggle}> toggle counter </button>\r\n      <button onClick={() => counter.increase()}> increase </button>\r\n      {showCounter.value && <span> {counter.value} </span>}\r\n      <button onClick={() => counter.decrease()}> decrease </button>\r\n      <button onClick={todos.clear}> clear todos </button>\r\n      <input type=&quot;text&quot; value={newTodo.value} onChange={newTodo.onChange} />\r\n    </div>\r\n  );\r\n};`, `68861928885957720000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                Copy<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-js line-numbers\"><code class=\"language-js\"><span class=\"token keyword\">import</span> React<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span>\r\n  useInput<span class=\"token punctuation\">,</span>\r\n  useBoolean<span class=\"token punctuation\">,</span>\r\n  useNumber<span class=\"token punctuation\">,</span>\r\n  useArray<span class=\"token punctuation\">,</span>\r\n  useOnMount<span class=\"token punctuation\">,</span>\r\n  useOnUnmount\r\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react-hanger\"</span><span class=\"token punctuation\">;</span>\r\n\r\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\r\n  <span class=\"token keyword\">const</span> newTodo <span class=\"token operator\">=</span> <span class=\"token function\">useInput</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">const</span> showCounter <span class=\"token operator\">=</span> <span class=\"token function\">useBoolean</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">const</span> limitedNumber <span class=\"token operator\">=</span> <span class=\"token function\">useNumber</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">lowerLimit</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">upperLimit</span><span class=\"token operator\">:</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">const</span> counter <span class=\"token operator\">=</span> <span class=\"token function\">useNumber</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n  <span class=\"token keyword\">const</span> todos <span class=\"token operator\">=</span> <span class=\"token function\">useArray</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"hi there\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"sup\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"world\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">const</span> rotatingNumber <span class=\"token operator\">=</span> <span class=\"token function\">useNumber</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\r\n    <span class=\"token literal-property property\">lowerLimit</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">upperLimit</span><span class=\"token operator\">:</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>\r\n    <span class=\"token literal-property property\">loop</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span>\r\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n\r\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\r\n    <span class=\"token operator\">&lt;</span>div<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>showCounter<span class=\"token punctuation\">.</span>toggle<span class=\"token punctuation\">}</span><span class=\"token operator\">></span> toggle counter <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> counter<span class=\"token punctuation\">.</span><span class=\"token function\">increase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span> increase <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\r\n      <span class=\"token punctuation\">{</span>showCounter<span class=\"token punctuation\">.</span>value <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">&lt;</span>span<span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>counter<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span> <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>span<span class=\"token operator\">></span><span class=\"token punctuation\">}</span>\r\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> counter<span class=\"token punctuation\">.</span><span class=\"token function\">decrease</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token operator\">></span> decrease <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>button onClick<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>todos<span class=\"token punctuation\">.</span>clear<span class=\"token punctuation\">}</span><span class=\"token operator\">></span> clear todos <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>button<span class=\"token operator\">></span>\r\n      <span class=\"token operator\">&lt;</span>input type<span class=\"token operator\">=</span><span class=\"token string\">\"text\"</span> value<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>newTodo<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span> onChange<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>newTodo<span class=\"token punctuation\">.</span>onChange<span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\r\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\r\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\r\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>You can play with these in <a href=\"https://codesandbox.io/s/44m70xm70\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this CodeSandbox</a>.</p>\n<p>Check <a href=\"https://github.com/kitze/react-hanger\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this GitHub repo</a> for more information.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary 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>Summary</h2>\n<p>I was surprised to find out how many hooks have already being developed by the community to be honest. There are so many and I can’t go through all of them here. But if you’re hungry for more, check <a href=\"https://github.com/rehooks/awesome-react-hooks\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">this gem</a> I found which has a collection of tools, hooks, tutorials, videos, podcasts, and more.</p>","timeToRead":7,"frontmatter":{"unformattedDate":"2019-10-06T00:00:00.000Z","date":"October 06, 2019","title":"React hooks you should know about 🔥","subtitle":null,"id":null,"author":"Yaser Adel Mehraban","gravatar":null,"canonical_url":null,"tags":["showdev","webdev","reactjs","hooks"],"thumbnail":null,"cover":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB80lEQVR42h3NWW/TQBAHcH9v3vgGSEiVkHhCvCMBfQASVNp0nXidpHEOx7fjKz72yNqOvZujbCr9NPqPZmZXWYR4s2/MorWKo4+6iPQR7nZvAtyFuE8PPGM8pbeQMx5RHqAukdOCKXpycOjZiOksrBYx2abUSolftU7OzJSsY7qOkJuzsGr9PQ3KJq0OGe2q7jXGR2UUEYOc/i2DH0/T39p6MFkNxovRwnl8sYfa6q+2HE4WD/oKrLw/45fh1ApsI9tnWfsqn1NATGHRzStukbNPziG7RPUlYpcduybNNWmvUXON2+uuvoSNzBe54NGThcVmL48TqudHLaCaR2Y7tkpbu+wCIkIqEnaODmePCA/fuJg7iPtE2JibSCyzWgFuqXtEszH0KQyZHrLZrjbixi57FwnJrsQWiS0RW/kbEiYWFuEyG1mjADOf+WTuIugfxg56torRJtd8poU1vGngroFJC4ter8S0EmrIgd+vkTDSWlFdMhmB+a9vuosHU+9eNb+D9TigetRAKX6rNzVMj9Oi//T59O79CWRcz5gCg8PPAbj7eKc6pWoXk4CoAVYDMo1bPW5uokZPWj2VbTvLj1/uxYevHOZc7ihPy/h5Wz5sCtWpgOQiIO/tQjUzdbtXN7LmwEPAxzdONQkrGCPVw4+b/X+4Fg+RSWL+rAAAAABJRU5ErkJggg=="},"backgroundColor":"transparent","images":{"fallback":{"src":"/static/09904b78b47fb999afe7aeb97a138b4e/a2195/socialpreview.png","srcSet":"/static/09904b78b47fb999afe7aeb97a138b4e/cadb4/socialpreview.png 750w,\n/static/09904b78b47fb999afe7aeb97a138b4e/a2195/socialpreview.png 800w","sizes":"(min-width: 800px) 800px, 100vw"},"sources":[{"srcSet":"/static/09904b78b47fb999afe7aeb97a138b4e/11ba1/socialpreview.webp 750w,\n/static/09904b78b47fb999afe7aeb97a138b4e/5f042/socialpreview.webp 800w","type":"image/webp","sizes":"(min-width: 800px) 800px, 100vw"}]},"width":800,"height":400}}},"img":null,"socialPreview":{"publicURL":"/static/09904b78b47fb999afe7aeb97a138b4e/socialpreview.png"}}}},"pageContext":{"title":"React hooks you should know about 🔥","postPath":"/blog/2019/10/06/react-hooks-should-know","nextPost":"/blog/2019/10/18/vue-intro","previousPost":"/blog/2019/09/29/navigation-timing"}},"staticQueryHashes":[],"slicesMap":{}}